我对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;
}
答案 0 :(得分:28)
7.21.4 / 1(C99),重点是我的:
比较函数memcmp,strcmp返回的非零值的符号, 和strncmp由第一个值的差异符号决定 在对象中不同的字符对(都解释为unsigned char ) 比较。
C90中有类似的东西。
请注意,strcoll()可能比strcmp()更适应,特别是如果你的字符在基本字符集之外。