1

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

#include <iostream>
using namespace std;

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

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

zero.exe stack

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

4

2 回答 2

7

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

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

#include <string>

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

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

#include <cstring>

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

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

于 2012-06-19T17:26:03.547 回答
2

问题是它与程序中argv[2]的字符串文字“stack”不同的“stack”。
毕竟这是 C++,如果你按照你的方式比较两个字符串,你只是在比较它们的地址。

编辑:
在您的示例中,zero.exe stack,argv[0]包含程序名称并argv[1]包含“堆栈”,因此您也差了一个。

更多编辑:
我想我知道编号混乱来自哪里...如果您在 Visual Studio 调试器下运行,您可以在项目的属性页中输入命令行参数,在这种情况下,zero.exe将变为 argv[1 ], 是的。程序本身的名称将始终在 argv[0] 中。

于 2012-06-19T17:22:00.470 回答