如果两个相似的字符串长度不同,strcmp会返回什么?

我明白如果你在strcmp中有’cat’(string1)和’dog’(string2)(这是一个C问题)那么strcmp的返回值将小于0(因为’cat’在词法上小于’dog’ “)。

但是,如果发生这种情况,我不确定strcmp会发生什么:

string1: 'dog' string2: 'dog2'. 

strcmp将返回什么? 小于零,零或大于? 对于上下文,我试图编写一个比较器函数来比较字符串,并希望考虑以相同字符开头的字符串。 一个字符串可能有一个扩展名(例如上面例子中’dog2’中的’2’)。

编辑:这不是一个重复的问题。 这个问题据说类似于回复类型代表的问题 – 我说的是当字符串相同到一个点但随后其中一个停止而另一个继续时会发生什么。

它返回不同的八位字节的差异。 在您的示例'\0' < '2' ,返回负数。

它在C标准中定义为前两个不匹配字符之间的差异,但实现是疯狂的。 唯一的共同点是,对于相等的字符串,返回值为零,然后对于str1str1>str2 ,返回值分别为<0 or >0 。 来自ISO / IEC 9899:201x,§7.23.4比较function

比较函数memcmp,strcmp和strncmp返回的非零值的符号由第一对字符(均被解释为unsigned char)的值之间的差异符号确定,这些符号在被比较的对象中不同。

但是一些实现会注意将典型值返回为0, 1 and -1 。 请参阅即Apple实现( http://opensource.apple.com//source/Libc/Libc-262/ppc/gen/strcmp.c ):

 int strcmp(const char *s1, const char *s2) { for ( ; *s1 == *s2; s1++, s2++) if (*s1 == '\0') return 0; return ((*(unsigned char *)s1 < *(unsigned char *)s2) ? -1 : +1); } 

编辑:在Donut-release的Android启动库中( https://android.googlesource.com/platform/bootable/bootloader/legacy/+/donut-release/libc/strcmp.c )如果字符串相等,函数返回0和其他2个案例中的1,并且仅用于逻辑操作:

 int strcmp(const char *a, const char *b) { while(*a && *b) { if(*a++ != *b++) return 1; } if(*a || *b) return 1; return 0; } 

来自man strcmp:

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

这通常会像@hroptatyr描述的那样实现。

C11报价

C11 N1570标准草案

我认为"dog" < "dog2"由以下引语保证:

7.23.4比较函数1比较函数memcmp,strcmp和strncmp返回的非零值的符号由第一对字符(均被解释为unsigned char )的值之间的差异符号确定。被比较的对象。

所以字符被解释为数字, '\0'保证为0

然后:

7.23.4.2 strcmp函数2 strcmp函数将s1指向的字符串与s2指向的字符串进行比较。

说,显然,字符串被比较,并且:

7.1.1术语的定义1字符串是由第一个空字符终止并包括第一个空字符的连续字符序列。

说null是字符串的一部分。

最后:

5.2.1字符集2 [...]所有位设置为0的字节,称为空字符,应存在于基本执行字符集中; 它用于终止字符串。

所以'\0'等于零。

由于解释是unsigned char ,并且所有字符都不同,因此零是可能的最小数字。