char指针和IF语句

时间:2011-07-06 07:53:42

标签: c pointers if-statement

我有一个从函数返回的char指针,我想使用IF语句仔细检查它的值我应该如何在C中实现这个。

来自here

子串函数

我想要这样的东西

if (substring("xxxNameYYY",0,3)=="xxx"){
     //do this
} else {
     //do that
}

以上if语句总是去“做那个”部分。

感谢

5 个答案:

答案 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个指针,而不是他们指向的字符串