作为一种练习,我想尽可能简短地实现字符串比较。 代码如下:
#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
。
答案 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)
如果你发现两个不相等的字符,你仍然增加指针a
和b
,然后返回*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);
}