命令行参数是否为某些字符串?

Ins*_*Man 1 c++ command-line-arguments

几个小时前我在C++中问过类似的关于命令行参数的问题.现在我有另一个问题,据我所知,命令行参数将像argv数组中的字符串一样保存.所以将主题与字符串进行比较应该是合乎逻辑的,但它不能按照我想要的方式工作,看看这段代码:

#include <iostream>
using namespace std;

int main(int argc,char** argv)
{
    if (argv[2]=="stack") cout << "right";
    cout << argv[2];
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

现在我将此命令传递给名为zero.exe的已编译应用程序;

zero.exe stack
Run Code Online (Sandbox Code Playgroud)

输出应该是"rightstack",但if命令将跳过并且只会cout << argv[2];执行,因此只有堆栈将显示在监视器上.它显示"stack"保存argv[2],所以if (argv[2]=="stack")应该工作,但事实并非如此.问题出在哪儿?

Mik*_*our 8

由于历史原因,参数作为C风格的字符串传递; 也就是说,每个都是一个指向字符数组的指针,带有一个零值字符来标记结尾.类似地,字符串文字(如"stack")是一个简单的字符数组.

您的代码会比较两个指针,即使字符串值相等也不会相等.要比较字符串,请将一个(或两个)转换为std::string:

#include <string>

std::string arg2(argv[2]);
if (arg2=="stack") std::cout << "right\n";
Run Code Online (Sandbox Code Playgroud)

或使用C库函数比较C风格的字符串; 这可能更有效,但也更难阅读:

#include <cstring>

if (std::strcmp(argv[2], "stack") == 0) std::cout << "right\n";
Run Code Online (Sandbox Code Playgroud)

此外,参数从1开始计算,程序名称为argv[0],因此您可能希望进行测试argv[1]而不是argv[2].

  • 另一个巧妙的技巧是`std :: vector <std :: string>(argv,argv + argc);` (4认同)
  • 你说"你的代码比较两个指针,即使字符串值相等也不会相等." 这当然是这种情况,我不是在争论.但在其他情况下,例如,如果在相同的源代码中有两个相同的字符串文字,它们很可能会折叠,而`("test"=="test")`将评估为true. (3认同)