2009-11-30 43 views
0

我的一位朋友向我展示了閱讀字符產生意外行爲的情況。讀取字符'¤'導致他的程序崩潰。我可以得出結論,'¤'是164小數,因此它超過了ASCII範圍。閱讀ASCII以外的字符

我們注意到'¤'上的行爲,但任何字符> 127似乎都顯示出問題。問題是我們如何可靠地通過char來讀取這些字符char?

int main(int argc, const char *argv[]) 
{ 
    char input; 
    do 
    { 
     cin >> input; 
     cout << input; 
     cout << " " << setbase(10) << (int)input; 
     cout << " 0x" << setbase(16) << (int)input; 

     cout << endl; 
    } while(input); 
    return 0; 
} 


[email protected]:temp/2009-11-30 $ ./a.out 
¤ 
 -62 0xffffffc2 
¤ -92 0xffffffa4 

回答

2

你的系統使用的是UTF-8字符編碼(如它應該),所以字符「¤」使你的程序讀取的字節C2 A4的序列。由於char是一個字節,因此它一次讀取一個字節。查看wchar_t和相應的wcinwcout流來讀取多字節字符,但我不知道它們支持哪些編碼或它們如何使用語言環境。另外,你的程序正在輸出無效的UTF-8,所以你真的不應該看到這兩個字符 - 我的系統上會出現問號。

(這是一個挑剔,有點offtopic,但你while(input)應該是while(cin),否則你會得到一個無限循環)。

+0

使用wchar_t,wcin和wcout時,處理unicode字符時出現無限循環。 – Masse 2009-11-30 06:32:23

+0

如果你沒有改變'while(input)',你將會無限循環。 – 2009-11-30 06:42:14

+0

是的,固定它。然而,即使在(輸入)我有字符的情況下,只有當我試圖給軟件EOF時,纔會導致無限循環。用wchar我有每個nonascii字符的無限循環。 – Masse 2009-11-30 10:57:16

1

這是很難說爲什麼你的朋友的計劃是沒有看到的代碼崩潰,但也可能是因爲你正在使用的字符作爲索引到一個數組。由於正常ASCII範圍以外的字符會溢出已簽名字符的限制,所以字符將最終爲負值。

1

聲明「輸入」作爲無符號字符代替

+0

我得到幾乎相同的行爲。 194 0xc2 ¤164 0xa4 雖然第二個是正確的,但我仍然得到兩個打印件。 – Masse 2009-11-30 06:06:18

+0

我似乎錯過了發佈中的UTF-8標籤。抱歉。 – 2009-12-01 07:55:03