我曾问命令行参数类似的问题在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")
应该工作,但实际上并非如此。 问题出在哪儿?
由于历史的原因,参数为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]
问题是, argv[2]
是一个不同的 “堆栈”比字符串“堆栈”你在你的程序有。
这是C ++毕竟,在这里,如果你比较两个字符串你的方式,你只是比较他们的地址。
编辑:
在你的榜样, zero.exe stack
, argv[0]
包含了程序名和argv[1]
包含“栈”,所以你也关闭的一个。
更多编辑:
我想我看到其中编号混乱来自...如果你在Visual Studio调试器下运行,你可以在项目的属性页输入命令行参数,在这种情况下, zero.exe
将成为的argv [1 ]是的。 程序本身的名字将永远是argv中[0]。