等于在C ++中返回false

时间:2018-10-02 11:27:44

标签: c++ g++ command-line-arguments

我对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 :(得分:24)

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

答案 1 :(得分:17)

您无法使用char将指向char const*的指针与字符串文字(==)进行比较。使用std::strcmp()<cstring>)或从中构造std::string<string>),使其与使用char*的{​​{1}}具有可比性。

答案 2 :(得分:0)

尝试一下:

#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;
}