在C ++中比较字符数组和字符串文字

时间:2009-10-28 19:06:13

标签: c++ string-literals character-arrays

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

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

这导致以下错误:与字符串文字比较导致未指定的行为。我也尝试过这样的事情:

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

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

4 个答案:

答案 0 :(得分:24)

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

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

答案 1 :(得分:17)

如果字符串相等,

std::strcmp将返回0。

答案 2 :(得分:3)

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

  • 值<当a< 0时B'/ LI>
  • 0时a == b
  • 值>当a> 0时为0 B'/ LI>

答案 3 :(得分:0)

由于问题用标记,除了David Seilers excellent explanation为何strcmp()在您的情况下不起作用外,我想指出的是,strcmp()确实可以通常不适用于字符数组,仅适用于以空终止的字符数组(Source)。

在您的情况下,您正在将字符串文字分配给字符数组,这将自动导致以null终止的字符数组,因此这里没有问题。但是,如果您从e中切出字符数组。 G。缓冲区,它不能为空终止。在这种情况下,使用strcmp()是危险的,因为它将遍历内存,直到找到空字节('\0')形成字符串为止。

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

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

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

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