STRCMP()和符号/无符号字符(strcmp() and signed / unsigned c

2019-07-04 03:14发布

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

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

Answer 1:

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

由比较功能memcmp,的strcmp,和STRNCMP返回非零值的符号是由所述第一对字符( 均解释为无符号字符 )的是,在不同的对象被比较的值之间的差的符号来确定。

有一个在C90类似的东西。

需要注意的是与strcoll()可能更适应比的strcmp(),特别是如果你有基本的字符集以外的字符。



文章来源: strcmp() and signed / unsigned chars
标签: c standards