2011-07-14 88 views
7

我有一個C代碼,我在ctype.h中使用標準庫函數isalpha(),這是在Visual Studio 2010-Windows上。 在下面的代碼,如果字符c是「£」,將因而isalpha調用返回的斷言如下圖所示的快照:isalpha()給出斷言

enter image description here

char c='£'; 

if(isalpha(c)) 
{ 
    printf ("character %c is alphabetic\n",c); 

} 
else 
{ 
    printf ("character %c is NOT alphabetic\n",c); 
} 

我可以看到,這可能是因爲8位ASCII做沒有這個角色。

那麼我如何處理ASCII表以外的非ASCII字符呢?

我想要做的是如果發現任何非字母字符(即使它包含不在8位ASCII表中的此類字符),我希望能夠忽略它。

+1

請注意,''''不是ASCII字符。你在混合上下文:結果可能會令人驚訝。 – pmg

回答

8

可能要投送到isalpha的值(在<ctype.h>聲明的其他功能)來unsigned char

isalpha((unsigned char)value) 

它的一個(N如此)少數情況下,鑄件在C中是合適的。


編輯添加說明。

根據the standard,強調的是礦

7.4

1所述的報頭<ctype.h>聲明進行分類和映射 字符有用幾個功能。在所有情況下,參數是int,其值應爲 ,可表示爲unsigned char或等於宏EOF的值。 如果參數 有任何其他值,則行爲未定義。

演員到unsigned char確保了調用isalpha()不調用未定義的行爲。

+0

謝謝。 char c; C = '£'; isalpha((unsigned char)(c));確實有效。沒有斷言和isalpha現在返回'英鎊'不是字母。 – goldenmean

+0

正確的答案,恕我直言,不充分的解釋... – Alnitak

+0

@Alnitak:hehehe我沒有真正解釋任何東西......張貼編輯 – pmg

8

您必須通過intisalpha(),而不是char。注意標準原型此功能:

int isalpha(int c); 

傳遞一個8位帶符號的字符將導致值被轉換成一個負整數,導致非法負偏移量通常由isxxxx()內部陣列。

但是你必須確保投放時,您char作爲unsigned治療 - 你不能簡單地直接將它轉換成int,因爲如果它是導致int仍然是負的8位字符。

確保此功能的典型方法是將其轉換爲unsigned char,然後依靠隱式類型轉換將其轉換爲int

例如

char c = '£'; 
int a = isalpha((unsigned char) c); 
+0

我不這麼認爲。即使當我嘗試 - int c; C = '£';並將其傳遞給isalpha(c),它斷言。 – goldenmean

+1

@goldenmean如果你的默認字符是有符號的,它仍然會傳遞一個負數。如果你嘗試'int c =(unsigned char)',''會發生什麼? – Alnitak

+0

正如pmg上面回答的那樣,char c; C = '£'; isalpha((unsigned char)(c));確實有效。沒有斷言和isalpha現在返回'英鎊'不是字母。 – goldenmean

2

您可能使用WCHAR(UNICODE)作爲字符類型被編譯,在這種情況下使用該因而isalpha方法是iswalpha

http://msdn.microsoft.com/en-us/library/xt82b8z8.aspx

+0

K謝謝。現在使用如果(iswalpha(c)),它沒有斷言,但現在它通過'英鎊'作爲一個字母字符,當我只想要字母([a..z])被推斷爲字母字符。 – goldenmean

+0

@Anders - 現在,除非goldenmean將其char轉換爲wchar_t,否則他將char和Unicode混合在一起,這是不正確的。 – AAT