等于在c ++中返回false

Arj*_*n C 17 c++ g++ command-line-arguments

我对cpp很新,我正在尝试做一个项目.它说代码必须以文件名作为参数,并将由以下代码运行:

./main -i filename
Run Code Online (Sandbox Code Playgroud)

我编写了一个for循环,它将遍历参数列表以找到"-i"参数,以便我可以确定文件名.但这一行总是返回false:

argv[i] == "-i"
Run Code Online (Sandbox Code Playgroud)

以下是我的代码:

#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;
}
Run Code Online (Sandbox Code Playgroud)

Edg*_*jān 23

argv[i] == "-i"
Run Code Online (Sandbox Code Playgroud)

在上面的行中,您可以比较两个指针: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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

这是一种更好的方式,因为它避免了std::string创作.

  • `它比较了两个指针,所以结果总是假的.:不是真的.指针比较定义明确.指向同一地址的指针之间的比较是合理的操作,这是很常见的.`char*`literal和`argv`成员之间的比较机会几乎为零,但在技术上仍然是合法的结果.这有点挑剔,但这就是SO`\_(ツ)_ /¯` (5认同)
  • 从索引1开始也是一个好主意,因为0用于程序名称. (3认同)
  • 如果您正在使用C++ 17,为什么不使用字符串文字而不是声明一个完全不必要的常量?`if(argv [i] ==" - i"sv)...`. (2认同)

Swo*_*ish 17

您无法将指针与char使用的字符串文字(char const*)进行比较==.使用std::strcmp()(<cstring>)或从中构造一个std::string(<string>)使其与char*使用相媲美==.