我很困惑strcmp(),或者說,它是如何由標準定義的。考慮比較兩個字符串,其中一個包含ASCII-7範圍之外的字符(0-127)。strcmp()和有符號/無符號字符
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
看看這篇文章。 http://www.ddj.com/cpp/184402023 – adatapost 2009-08-31 10:14:59
......這與這個問題有關,因爲......? – DevSolar 2009-08-31 11:01:30