2009-08-31 175 views
14

我很困惑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 
+0

看看這篇文章。 http://www.ddj.com/cpp/184402023 – adatapost 2009-08-31 10:14:59

+3

......這與這個問題有關,因爲......? – DevSolar 2009-08-31 11:01:30

回答

26

7.21.4/1(C99),強調的是礦:

由比較功能memcmp返回非零值的符號,的strcmp , 和strncmp由第一個 一對字符(均解釋爲無符號字符)的值之間的差值的符號確定,與 比較的對象不同。

C90中有類似的東西。

請注意,strcoll()可能比strcmp()更適合,特別是如果您在基本字符集之外具有字符。

+0

非常好。這正是我一直在尋找的答案。謝謝! – DevSolar 2009-08-31 11:03:14

相關問題