C ++相同的字符串不相等(实际上是char *)

时间:2018-08-09 09:52:04

标签: c++ pointers

我在将参数传递到程序中时遇到问题,除了它们相同之外,似乎不等于我输入的参数。将它们转换为字符串会使它们完全相同,但是我想知道为什么最初的二重奏组不是这样。

这是我的代码:

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 []”。不过,不知道该如何处理。

4 个答案:

答案 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