字符串比较在一行

时间:2013-07-18 10:44:16

标签: c strcmp

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

#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

在比较字符串与自身的情况下会出现什么问题?

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

修改 编译器在Ubuntu下是gcc

4 个答案:

答案 0 :(得分:3)

如果您的功能不提供相同的功能,请不要将它们与标准库中的功能相同。当你这样做时,你将以微妙的方式打破许多事情。显然这就是这里的错误。

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

答案 1 :(得分: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

答案 2 :(得分:1)

如果你发现两个不相等的字符,你仍然增加指针ab,然后返回*a==*b,这样你就会返回比较字符的结果后面的字符串不同的地方。最好这样做:

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

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

编辑,但不解释测试用例4,但通过使用函数名称strcmp()解释,其他答案告诉我们。

答案 3 :(得分: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);
}