2016-04-09 197 views
2

我知道如果你在strcmp中有'cat'(string1)和'dog'(string2)(这是一个C问题),那么strcmp的返回值将小于0(因为'cat'在词汇上小于'狗')。如果两个相似的字符串长度不同,strcmp会返回什么结果?

但是,我不知道会使用strcmp发生什么,如果发生这种情况:

string1: 'dog' 
string2: 'dog2'. 

什么会strcmp的返回?小于零,零还是大于?对于上下文,我试图编写一个比较函数来比较字符串,并且想要考虑以相同字符开头的字符串。一个字符串可能有一个扩展名(例如上面示例中的'dog2'中的'2')。

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

+1

为什么不简单地尝试呢? –

+1

[c]中的[strcmp()返回值可能重复(http:// stackoverflow。com/questions/7656475/strcmp-return-values-in-c) – MicroVirus

+1

因为我发现与C相比,事情并不总是一致的。类型的大小就是一个很好的例子。 –

回答

2

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

+0

哦,所以它基本上比较空字符?这总是少于其他任何东西,不是吗? –

1

从人的strcmp:

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

这通常会像@ hroptatyr描述的那样执行。

+0

所以只是为了澄清托马斯 - 在较短的字符串末尾的空字符进行比较,因此较小的字符串是“小于”较大的字符? –

+1

@DanielSoutar是的。 – totoro

+0

谢谢,这有助于 –

1

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

由比较功能 memcmp,的strcmp和STRNCMP由 的符号来确定返回非零值的符号第一对字符的值之间的差异(两个 解释为无符号字符),这些差异在对比为 的对象中有所不同。

但是,一些实现小心地将典型值返回为0, 1 and -1。见,即苹果执行(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); 
} 

编辑: 在为甜甜圈释放(https://android.googlesource.com/platform/bootable/bootloader/legacy/+/donut-release/libc/strcmp.c)函数返回0如果字符串相等1为其他2例,而仅使用逻辑Android的启动库操作:

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

C11报价

C11 N1570 standard draft

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

7.23.4比较函数由比较功能memcmp,的strcmp, 和STRNCMP返回非零值的符号是由确定第一个 字符对的值(两者解释为无符号字符)的值之间的差异的符号,所述对象与在 中比较的对象不同。

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

然后:

7.23.4.2的功能的strcmp 2 的 功能的strcmp指向的字符串进行比较由s1指向由 s2指向的字符串。

说,很明显,串进行比较,并且:

术语 1所述的串的

7.1.1定义是由封端的,并且包括第一个空字符 字符的连续序列。

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

最后:

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

因此'\0'等于零。

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

相关问题