2009-08-31 178 views
14

我很困惑strcmp(),或者说,它是如何由标准定义的。考虑比较两个字符串,其中一个包含ASCII-7范围之外的字符(0-127)。strcmp()和有符号/无符号字符

C标准定义:

INT的strcmp(常量字符* S1,常量字符* S2);

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

的的strcmp函数返回一个整数大于,等于,或小于零 ,因此作为 串指向S1大于 ,等于,或小于 串s2指向到。

参数是char *。不是unsigned char *。没有观念认为“应该以unsigned进行比较”。

但我检查过的所有标准库都认为“高”字符就是这样,的值高于的值,而不是ASCII-7字符。

我明白这是有用的和预期的行为。我不想说现有的实现是错误的或什么的。我只想知道,哪些部分在标准规格中我错过了

int strcmp_default(const char * s1, const char * s2) 
{ 
    while ((*s1) && (*s1 == *s2)) 
    { 
     ++s1; 
     ++s2; 
    } 
    return (*s1 - *s2); 
} 

int strcmp_unsigned(const char * s1, const char *s2) 
{ 
    unsigned char * p1 = (unsigned char *)s1; 
    unsigned char * p2 = (unsigned char *)s2; 

    while ((*p1) && (*p1 == *p2)) 
    { 
     ++p1; 
     ++p2; 
    } 
    return (*p1 - *p2); 
} 

#include <stdio.h> 
#include <string.h> 

int main() 
{ 
    char x1[] = "abc"; 
    char x2[] = "abü"; 
    printf("%d\n", strcmp_default(x1, x2)); 
    printf("%d\n", strcmp_unsigned(x1, x2)); 
    printf("%d\n", strcmp(x1, x2)); 
    return 0; 
} 

输出是:

103 
-153 
-153 
+0

看看这篇文章。 http://www.ddj.com/cpp/184402023 – adatapost 2009-08-31 10:14:59

+3

......这与这个问题有关,因为......? – DevSolar 2009-08-31 11:01:30

回答

26

7.21.4/1(C99),强调的是矿:

由比较功能memcmp返回非零值的符号,的strcmp , 和strncmp由第一个 一对字符(均解释为无符号字符)的值之间的差值的符号确定,与 比较的对象不同。

C90中有类似的东西。

请注意,strcoll()可能比strcmp()更适合,特别是如果您在基本字符集之外具有字符。

+0

非常好。这正是我一直在寻找的答案。谢谢! – DevSolar 2009-08-31 11:03:14

相关问题