0

作为一种练习,我想尽可能短地实现字符串比较。代码如下:

#include <stdio.h>

int strcmp(const char* a, const char* b)
{
     for(;a && b && *a && *b && *a++==*b++;);return *a==*b;
}


int main ()
{
    const char* s1 = "this is line";
    const char* s2 = "this is line2";
    const char* s3 = "this is";
    const char* s4 = "this is line";


    printf("Test 1: %d\n", strcmp(s1, s2));
    printf("Test 2: %d\n", strcmp(s1, s3));
    printf("Test 3: %d\n", strcmp(s1, s4));
    printf("Test 4: %d\n", strcmp(s1, s1));
    printf("Test 5: %d\n", strcmp(s2, s2));

    return 0;
}

结果是:

Test 1: 0
Test 2: 0
Test 3: 1
Test 4: 0
Test 5: 0

在将字符串与自身进行比较的情况下出了什么问题?

注意: 我知道有一个更短的解决方案,但我想自己找到它。

编辑: 编译器gcc在 Ubuntu 下。

4

4 回答 4

3

如果它们不提供相同的功能,请不要将您的函数称为与标准库中的函数相同的函数。当你这样做时,你会以微妙的方式破坏许多东西。显然这是这里的错误。

在这里添加一些更有用的评论。请改用 while 循环。不要检查参数是否为 NULL,这是一种不好的风格,即使 for 循环因此而结束,return 语句也会崩溃,因为它会取消引用 NULL。

于 2013-07-18T10:54:50.610 回答
2

我用 GCC-4.4.7 测试了你的代码,得到了相同的结果。GCC 页面描述了strcmp http://gcc.gnu.org/projects/optimize.html的优化

GCC 可以优化 strcmp(和 memcmp),其中一个字符串是常量,以将连续字节与已知的内联字节进行比较。

重命名您的函数,您将获得预期的结果,如下所示:

$ cc yourcode.c
$ ./a.out 
Test 1: 0
Test 2: 0
Test 3: 1
Test 4: 0
Test 5: 0
$ cc -D strcmp=strcmp1 yourcode.c
$ ./a.out 
Test 1: 0
Test 2: 0
Test 3: 1
Test 4: 1
Test 5: 1
于 2013-07-18T11:07:21.410 回答
1

如果发现两个不相等的字符,则增加指针ab然后返回*a==*b,以便返回比较字符串不同位置后面的字符的结果。最好这样做:

for(;*a && *b && *a==*b; a++, b++) ;
return *a==*b;

重命名您的功能。它是evereything,但strcmp。

编辑没有解释测试用例 4,但strcmp()正如其他答案所告诉的那样,这是通过使用函数名称来解释的。

于 2013-07-18T10:56:31.477 回答
0

这是一个正确的 strcmp

int             my_strcmp(char *str1, char *str2)
{
  int           i;

  i = 0;
  while (str1[i] || str2[i])
    {
      if (str1[i] != str2[i])
        return (str1[i] - str2[i]);
      i++;
    }
  return (0);
}
于 2013-07-18T11:10:57.060 回答