第一个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函数的工作
答案 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);
}