Equals возвращает false в С++
Я новичок в cpp, и я пытаюсь сделать проект. В нем говорится, что код должен принимать имя файла в качестве аргумента и будет выполняться:
./main -i filename
Я написал цикл for, который будет перебирать список аргументов, чтобы найти аргумент "-i", чтобы я мог определить имя файла. Но эта строка всегда возвращает false:
argv[i] == "-i"
Ниже мой код:
#include <string>
#include <iostream>
int main(int argc, char *argv[]) {
std::string test = argv[0];
for(int i = 0; i < argc; i++){
if(argv[i] == "-i"){
test = argv[i+1];
break;
}
}
std::cout << test;
return 1;
}
Ответы
Ответ 1
argv[i] == "-i"
В приведенной выше строке вы сравниваете два указателя: char*
и const char*
, соответственно.
Другими словами, вместо сравнения argv[i]
и "-i"
сравниваются два указателя, которые вряд ли указывают на одно и то же местоположение. В результате проверка не работает в вашем случае.
Вы можете исправить это несколькими способами, например, обернуть "-i"
в std::string
чтобы сделать сравнение правильной:
const auto arg = std::string{ "-i" };
for(int i = 0; i < argc; i++){
if(argv[i] == arg){
test = argv[i+1];
break;
}
}
Начиная с С++ 17 вы также можете использовать std::string_view
:
const std::string_view sv{ "-i" };
for(int i = 0; i < argc; i++){
if(argv[i] == sv){
test = argv[i+1];
break;
}
}
который является предпочтительным способом, поскольку он избегает создания std::string
.
Ответ 2
Вы не можете сравнивать указатели на char
с строковыми литералами (char const*
), используя ==
. Используйте std::strcmp()
(<cstring>
) или <cstring>
него std::string
(<string>
), чтобы сделать его сопоставимым с char*
using ==
.
Ответ 3
попробуй это:
#include <iostream>
#include <string>
using namespace std;
int main(int argc, char *argv[]) {
string test;
for(int i = 0; i < argc; i++){
cout << "\n" << argv[i] << endl;
if((string)argv[i] == "-i"){
test = argv[i + 1];
cout << "test= " << test << endl;
break;
}
}
cout << test << endl;
system("pause");
return 0;
}