我有一个字符数组,我试图弄清楚它是否与字符串文字匹配,例如:
char value[] = "yes";
if(value == "yes") {
// code block
} else {
// code block
}
这导致以下错误:与字符串文字比较导致未指定的行为。我也尝试过这样的事情:
char value[] = "yes";
if(strcmp(value, "yes")) {
// code block
} else {
// code block
}
这不会产生任何编译器错误,但它的行为不符合预期。
答案 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)的调用时,函数返回
答案 3 :(得分:0)
由于问题用c++标记,除了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
}