string.h的strcmp与我自己的strcmp实现之间的区别

时间:2019-06-14 12:38:30

标签: c string pointers

第一个printf的输出为-1,而第二个printf的输出为-115。

#include<stdio.h>
#include<string.h>
int mystrcmp(char*s, char*t){
    for(;*s==*t;s++,t++){
        if(*s=='\0'){
            return 0;
        }
    }
    return (*s-*t);
}
int main()
{
    char *y,*x="this";
    y="thiss";
    printf("%d\n\n",strcmp(x,y));
    printf("%d",mystrcmp(x,y));
    return 0;
}

我了解,在我的实现中,代码正在计算0(ASCII为Null)-'s'(ASCII值115)。 任何人都可以帮助我如何精确复制string.h中的strcmp函数的工作

3 个答案:

答案 0 :(得分:10)

在不相等的情况下,从strcmp返回的确切值未明确定义。在您的特定情况下,任何负值均视为有效。来自man page

  

strcmp()和strncmp()函数返回小于的整数,   如果s1(或其前n个字节)为,则等于或大于零   发现分别小于,匹配或大于s2。

因此,唯一的保证是,如果第一个参数“小于”第二个参数,则结果为负;如果第一个参数“大于”第二个参数,则结果为正。不同的实现可能为相同的字符串返回不同的值。

作为示例,如果我在优化设置为-O0的计算机上编译并运行您的代码,我将从strcmp返回-115。如果将优化更改为-O1,它将返回-1。因此,结果不仅可以从一台计算机更改为另一台计算机,而且在具有不同编译器设置的同一台计算机上甚至可以有所不同。

答案 1 :(得分:2)

您平台上的“真实” strcmp实现很可能类似于以下代码:

int strcmp(const char *s, const char *t) {
    for(; *s == *t; s++, t++) {
        if (*s == '\0') {           // are we at the end ?
            return 0;               // yes
        }
    }
    return (*s-*t) > 0 ? 1 : -1;   // return either +1 or -1
}

顺便说一句:应该是int strcmp(const char *s, const char *t)而不是int strcmp(char *s, char *t)

答案 2 :(得分:0)

  

manuel页面说strcmp()函数将两者进行比较   字符串s1和s2。它返回小于,等于或等于的整数   如果发现s1分别小于,则大于零   匹配或大于s2。   您可以尝试以下代码:

    int ft_strcmp(const char *s1, const char *s2)
{
    while ((unsigned char)*s1 || (unsigned char)*s2)
    {
        if ((unsigned char)*s1 != (unsigned char)*s2)
            return ((unsigned char)*s1 - (unsigned char)*s2);
        s1++;
        s2++;
    }
    return (0);
}