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

时间:2016-04-09 15:33:35

标签: c strcmp

我明白,如果你有“猫”这样的话。 (string1)和' dog' strcmp中的(string2)(这是一个C问题)然后strcmp的返回值将小于0(因为' cat'在词法上小于' dog')。

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

string1: 'dog'
string2: 'dog2'.

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

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

5 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:3)

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

  

比较函数返回的非零值的符号   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(https://android.googlesource.com/platform/bootable/bootloader/legacy/+/donut-release/libc/strcmp.c)的Android启动库中,如果字符串相等,则函数返回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;
}

答案 2 :(得分:2)

C11引用

C11 N1570 standard draft

我认为"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,并且所有字符都不同,因此零是可能的最小数字。

答案 3 :(得分:1)

来自man strcmp:

  

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

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

答案 4 :(得分:0)

如果只想比较两个字符串的起始extract(year from sysdate) date_part_year(trunc(getdate())) to_char(current_date, 'YYYY') 字符,请使用strncmp而不是strcmp:

len
在这种情况下,

res将为0。