strcmp()和signed / unsigned字符

时间:2009-08-31 09:59:37

标签: c standards

我对strcmp()感到困惑,或者更确切地说,它是如何被标准定义的。考虑比较两个字符串,其中一个字符串包含ASCII-7范围之外的字符(0-127)。

C标准定义:

  

int strcmp(const char * s1,const char * s2);

     

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

     

strcmp函数返回一个大于,等于或的整数   小于零,因此如此   s1指向的字符串更大   比,等于或小于   s2指向的字符串。

参数为 char * 。不是 unsigned char * 。没有任何概念“比较应该以{{1​​}}”进行。

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

我理解这是有用的和预期的行为。我不想说现有的实现是错误的。我只是想知道,我错过了标准规格中的哪一部分

unsigned

输出是:

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;
}

1 个答案:

答案 0 :(得分:28)

7.21.4 / 1(C99),重点是我的:

  

比较函数memcmp,strcmp返回的非零值的符号,   和strncmp由第一个值的差异符号决定   在对象中不同的字符对(都解释为unsigned char )   比较。

C90中有类似的东西。

请注意,strcoll()可能比strcmp()更适应,特别是如果你的字符在基本字符集之外。