2009-10-27 15 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中完成 –

相关问题