没有strcmp()的字符串比较

时间:2013-08-01 19:52:45

标签: c string

如何用相等运算符比较两个字符串。我也在GNOME glib库中看到了。他们将两个字符串与==运算符进行比较。这是代码:

/* Code from Singly Linked List - gslist.c*/


GSList*
g_slist_find (GSList        *list,
              gconstpointer  data)  // Here gconstpointer is `const void*`
{
  while (list)
    {
      if (list->data == data)    // What is compare here?
        break;
      list = list->next;
    }

  return list;
}

那么,glib代码是否有效?

1 个答案:

答案 0 :(得分:3)

==上使用char*运算符只会检查它们是否指向相同的内存地址。当然,与==的真实比较的每个字符串对也将与strcmp进行比较。然而,相反的情况根本就不是这样。两个字符串很可能在词法上是等价的,但它们位于不同的地址

例如

char* p1 = "hello world";

// p2 will point to the same address as p1.  This is how pointer 
// assignment work 
char* p2 = p1;
printf ("%s\n", p1 == p2 ? "true" : "false")            // true
printf ("%s\n", strcmp(p1, p2) == 0 ? "true" : "false") // true

// the addressed return by malloc here will not be the address
// of p1. 
char* p3 = malloc(strlen(p1) + 1);
strcpy(p3, p2);
printf ("%s\n", p1 == p3 ? "true" : "false")            // false
printf ("%s\n", strcmp(p1, p3) == 0 ? "true" : "false") // true