这个字母应该是未签名的吗?

时间:2009-10-27 01:42:03

标签: c visual-studio-2008 character-encoding char

我在代码审查过程中发现了一些令人困惑的代码,我有点困惑。做了一些研究我发现了这种情况。我写了这个代码示例来突出问题

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.
{           
}

我的问题是,char无符号是否可行?理想情况下,我不会使用char但使用Unicode字符来避免这类问题,但软件很老,不会很快重新设计。

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

3 个答案:

答案 0 :(得分:7)

在这种情况下演员是正确的。来自man ispunct

  

ispunct()函数测试除空格外的任何打印字符   (' ')或isalnum(3)true的字符。的价值   参数必须可以表示为unsigned charEOF的值。

答案 1 :(得分:3)

如果你想使用ispunct,那么就无法解决它。

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

这就是导致断言失败的原因,因此演员阵容是合适的。

答案 2 :(得分:2)

进行演员表演是完全合法的。我相信C变量默认是签名但是强制转换使它可用。