如果两个相似的字符串长度不同,strcmp return 怎么办?

What does strcmp return if two similar strings are of different lengths?

我知道如果你在 strcmp 中有 'cat' (string1) 和 'dog' (string2) (这是一个 C 问题)那么 strcmp 的 return 值会更少小于 0(因为 'cat' 在词法上小于 'dog')。

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

string1: 'dog'
string2: 'dog2'.

strcmp return 是什么?小于零、零还是大于?对于上下文,我正在尝试编写一个比较器函数来比较字符串,并想考虑以相同字符开头的字符串。一个字符串可能有扩展名(例如上例中 'dog2' 中的 '2')。

编辑:这不是一个重复的问题。据称这类似于询问 return 类型代表什么的问题 - 我说的是当字符串在某一点上相同但其中一个停止而另一个继续时会发生什么。

它returns 不同的八位位组。在您的示例中 '[=10=]' < '2' 所以会返回一些负值。

来自 man strcmp:

The strcmp() and strncmp() functions return an integer less than, equal to, or greater than zero if s1 (or the first n bytes thereof) is found, respectively, to be less than, to match, or be greater than s2.

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

在C标准中定义为前两个不匹配字符的区别,但是实现很乱。唯一的共同点是 return 值对于相等的字符串是零,然后分别是 <0 or >0 对于 str1<str2str1>str2。 从 ISO/IEC 9899:201x, §7.23.4 比较函数:

The sign of a nonzero value returned by the comparison functions memcmp, strcmp, and strncmp is determined by the sign of the difference between the values of the first pair of characters (both interpreted as unsigned char) that differ in the objects being compared.

但有些实现会注意 return 典型值,如 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 == '[=10=]')
        return 0;
    return ((*(unsigned char *)s1 < *(unsigned char *)s2) ? -1 : +1);
}

编辑: 在 Donut-release (https://android.googlesource.com/platform/bootable/bootloader/legacy/+/donut-release/libc/strcmp.c) 的 Android 引导库中,函数 returns 0 if strings are equal 和 1 对于其他两种情况,以及仅使用逻辑运算:

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

C11 名言

C11 N1570 standard draft

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

7.23.4 Comparison functions 1 The sign of a nonzero value returned by the comparison functions memcmp, strcmp, and strncmp is determined by the sign of the difference between the values of the first pair of characters (both interpreted as unsigned char) that differ in the objects being compared.

所以字符被解释为数字,并且 '[=11=]' 保证是 0:

然后:

7.23.4.2 The strcmp function 2 The strcmp function compares the string pointed to by s1 to the string pointed to by s2.

表示,显然,比较字符串,并且:

7.1.1 Definitions of terms 1 A string is a contiguous sequence of characters terminated by and including the first null character.

表示 null 是字符串的一部分。

最后:

5.2.1 Character sets 2 [...] A byte with all bits set to 0, called the null character, shall exist in the basic execution character set; it is used to terminate a character string.

所以 '[=11=]' 等于零。

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

如果您只想比较两个字符串的初始 len 个字符,请使用 strncmp 而不是 strcmp:

#include <string.h>
size_t len = 3;
int res = strncmp("dog", "dog2", len);

在这种情况下 res 将为 0。