我在将参数传递到程序中时遇到问题,除了它们相同之外,似乎不等于我输入的参数。将它们转换为字符串会使它们完全相同,但是我想知道为什么最初的二重奏组不是这样。
这是我的代码:
int main(int argc, char *argv[]) {
if (argc>1) {
cout << "#" << argv[1] << "#" << endl;
cout << "#" << "nomast" << "#" << endl;
cout << (argv[1] == "nomast" ? "equal" : "not equal") << endl;
string s1 = argv[1];
string s2 = "nomast";
cout << (s1 == s2 ? "equal after all" : "nope") << endl;
system("pause");
}
return 0;
}
当我使用“ call somethingy.exe nomast”启动编译后的代码时,得到输出
#nomast#
#nomast#
not equal
equal after all
Press any key to continue . . .
我最好的主意是我没有正确处理“ char * argv []”。不过,不知道该如何处理。
答案 0 :(得分:6)
您正在比较的是指针,换句话说,不是它们的内容。
由于您使用的是C ++,因此建议您使用std::string
并比较这些对象(就像您在第二次比较中所做的那样)。
否则,如果必须使用C,只需使用C标准库中的strcmp
函数。
答案 1 :(得分:1)
问题很简单,这一行
cout << (argv[1] == "nomast" ? "equal" : "not equal") << endl;
在比较char *(指针)时给您不相等的含义,并且彼此不相等。这种比较确实是在做类似0x00134 == 0x00345的事情,它们都在不同的内存地址下。
在第二种情况下,使用std :: strings有一个特殊的operator ==,它将根据字符串中包含的字符对您进行比较。
要获得与第一个示例相同的结果,您需要做
if (strcmp(argv[1], "nomast") == 0) //need to add #include <string.h>
答案 2 :(得分:1)
您应该使用strcmp()
函数比较两个C字符串。对于C ++字符串,可以使用string::compare
。
答案 3 :(得分:0)
char * argv []是一个char
数组,该数组生成一个以null结尾的字符串,而实际上并没有重载==
来测试字符串是否相等。当您在语句==
中说argv[1] == "nomast"
时,它实际上是比较指针。
在
string s1 = argv[1];
string s2 = "nomast";
s1和s2是字符串对象。其中已重载==以测试相等性。
要在第一种情况下测试char字符串是否相等,请使用if (strcmp(argv[1], "nomast") == 0)
函数,或者您可以编写自己的函数来检查相等性。但是,今天建议对刺使用标准库std::string
。