【发布时间】:2009-08-31 09:59:37
【问题描述】:
我对 strcmp() 感到困惑,或者更确切地说,它是如何由标准定义的。考虑比较两个字符串,其中一个字符串包含 ASCII-7 范围 (0-127) 之外的字符。
C 标准定义:
int strcmp(const char *s1, const char *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
【问题讨论】:
-
...这与这个问题有关,因为...?