我有一个从函数返回的char指针,我想使用IF语句仔细检查它的值我应该如何在C中实现这个。
来自here 的子串函数
我想要这样的东西
if (substring("xxxNameYYY",0,3)=="xxx"){
//do this
} else {
//do that
}
以上if语句总是去“做那个”部分。
感谢
答案 0 :(得分:8)
您无法比较C中的字符串,您必须使用strcmp(str1, str2) == 0
来检查它们是否相等。
在你的情况下:
char * substr = substring("xxxNameYYY",0,3);
if (strcmp(substr, "xxx") == 0) {
/* TODO */
}
else {
/* TODO */
}
答案 1 :(得分:4)
由于这是一个指针,因此执行==比较指针的值,而不是指向它的字符串。因此返回的指针永远不会等于指向“xxx”的指针。您需要使用strcmp或其中的一些变体来比较字符串中的字符。
答案 2 :(得分:3)
if (!strncmp("xxxNameYYY", "xxx", 3))
这应该有效,失败的原因是因为C字符串常量是在.data部分中分配的,因为它们的大小在编译时是已知的。你最终比较的是substring("xxxNameYYY", 0, 3)
的地址,地址为“xxx”,它们永远不会相等。
答案 3 :(得分:2)
那是因为你的substring
函数返回一个C字符串(它是一个指向char
值的指针),你将它与另一个C字符串进行比较 - 所以你有效地比较了两个指针地址。这两个指针永远不会相同,因此你进入了else分支。
最好的解决方法是首先不要使用substring
功能;函数在内部分配内存,你有责任释放内存(使用free
)。这很容易出错。
相反,您可以使用strncmp
函数进行比较。我会将它包装在startsWith
函数中,如下所示:
/* Yields true if s starts with t */
bool startsWith( const char *s, const char *t )
{
return strncmp( s, t, strlen( t ) ) == 0;
}
然后,您可以将代码简化为
if (startsWith("xxxNameYYY", "xxx")) {
//do this
} else {
//do that
}
答案 4 :(得分:1)
改为使用strncmp功能:
if (strncmp("xxxNameYYY", "xxx", 3)==0){
//do this
} else {
//do that
}
我的代码你比较2个指针,而不是他们指向的字符串