Равно возвращает false в C ++ - PullRequest
       24

Равно возвращает false в C ++

0 голосов
/ 02 октября 2018

Я довольно новичок в 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;
}

Ответы [ 3 ]

0 голосов
/ 02 октября 2018

Нельзя сравнивать указатели на char со строковыми литералами (char const*), используя ==.Используйте std::strcmp() (<cstring>) или создайте из него std::string (<string>), чтобы сделать его сопоставимым с char*, используя ==.

0 голосов
/ 02 октября 2018

попробуйте это:

#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;
}
0 голосов
/ 02 октября 2018
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;
    }
}

Начиная с C ++ 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 создание.

...