8

我有一个字符数组,我试图弄清楚它是否与字符串文字匹配,例如:

char value[] = "yes";
if(value == "yes") {
   // code block
} else {
   // code block
}

这导致了以下错误:与字符串文字比较会导致未指定的行为。我也尝试过类似的东西:

char value[] = "yes";
if(strcmp(value, "yes")) {
   // code block
} else {
   // code block
}

这并没有产生任何编译器错误,但它的行为不符合预期。

4

4 回答 4

27

检查 strcmp 的文档。提示:它不返回布尔值。

ETA:==通常不起作用,因为cstr1 == cstr2比较指针cstr1,因此只有在和指向相同的内存位置时比较才会为真cstr2,即使它们碰巧都引用了字典上相等的字符串。您尝试的(将 cstring 与文字进行比较,例如cstr == "yes"尤其不起作用,因为标准不需要它。在一个合理的实现中,我怀疑它会爆炸,但cstr == "yes"不太可能成功,因为cstr不太可能引用字符串常量"yes"所在的地址。

于 2009-10-28T19:09:51.350 回答
22

std::strcmp如果字符串相等则返回 0。

于 2009-10-28T19:09:30.387 回答
3

strcmp 返回一个三态值以指示两个字符串的相对顺序。当调用 strcmp(a, b) 时,函数返回

  • 当 a < b 时,值 < 0
  • 0 当 a == b
  • 当 a > b 时,a 值 > 0
于 2009-10-28T19:16:38.527 回答
0

由于问题被标记为,除了David Seilers对为什么strcmp()在您的情况下不起作用的出色解释之外,我想指出,这strcmp()通常不适用于字符数组,仅适用于以空字符结尾的字符数组(Source) .

在您的情况下,您将字符串文字分配给字符数组,这将自动生成一个以空字符结尾的字符数组,所以这里没有问题。但是,如果您将字符数组从缓冲区中切出,它可能不会以空值结尾。在这种情况下,使用它是危险的,strcmp()因为它会遍历内存,直到找到一个空字节('\0')来形成一个字符串。

您的问题的另一个解决方案是(使用 C++ std::string):

char value[] = "yes";
if (std::string{value} == "yes")) {
    // code block
} else {
    // code block
}

这也仅适用于以空字符结尾的字符数组。如果您的字符数组不是以空值结尾的,请告诉std::string构造函数您的字符数组有多长:

char value[3] = "yes";
if (std::string{value, 3} == "yes")) {
    // code block
} else {
    // code block
}
于 2020-10-02T10:54:23.543 回答