我感到困惑的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