2009-10-27 16 views
5

我在代碼審查過程中發現了一些令人困惑的代碼,並且有點困惑。做一些研究,我發現這種情況。我寫的這個代碼示例突出問題這個字符應該是無符號的嗎?

char d = '©';// this is -87,the copyright symbol , (actually its 169 unsigned) 
if(ispunct(d)) // will assert. 
{   
} 

所以,誰是bug修復程序員,做了以下內容:

char d = '©';// this is -87,the copyright symbol , (actually its 169 unsigned) 
if(ispunct((unsigned char)d)) // will not assert, because it will be 169. 
{   
} 

我的問題是,它是否是OK使char無符號?理想情況下,我不會使用char,而是使用Unicode字符來避免此類問題,但該軟件非常舊,不會很快重新設計。

我正在使用Visual Studio 2008.可以在ctype.h找到ispunct()

回答

7

在這種情況下演員表是正確的。從man ispunct

任何印刷字符的ispunct()功能試驗除了空間 (' ')或字符爲哪些isalnum(3)true。參數的值必須可表示爲unsigned char或值EOF

+1

在同一個家族中的其他功能也是如此 - 例如'isalpha()','toupper()'等等。 – caf

2

做這個演員是完全合法的。我相信C變量是默認簽名的,但是這個變量使得它變得可用。

+6

其實,char是否被簽名是實現定義的。 – Artelius

3

如果你想使用ispunct,那麼就沒有辦法解決它。

_ASSERTE((unsigned)(c + 1) <= 256); 

這是什麼導致斷言失敗,因此演員是適當的。

+0

我發現也聲稱,這就是爲什麼它在我的審查過程中提出了一個紅旗。我不知道爲什麼它在crtdbg.h中完成 –

相關問題