这个字母应该是未签名的吗?
-
06-07-2019 - |
题
我在代码审查过程中发现了一些令人困惑的代码,我有点困惑。做了一些研究我发现了这种情况。我写了这个代码示例来突出问题
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 char来避免这类问题,但软件很老,不会很快重新设计。
我正在使用Visual Studio 2008. ispunct()
可以在 ctype.h
中找到。
解决方案
在这种情况下演员是正确的。来自 man ispunct 代码>
:
ispunct()
函数测试除空格之外的任何打印字符 (''
)或isalnum(3)
的字符是true
。的价值 参数必须可以表示为unsigned char
或EOF
的值。
其他提示
如果你想使用 ispunct
,那么就没办法了。
_ASSERTE((unsigned)(c + 1) <= 256);
这就是导致断言失败的原因,因此演员阵容是合适的。
进行演员表演是完全合法的。我相信C变量默认是签名但是强制转换使它可用。
不隶属于 StackOverflow