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

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变量默认是签名但是强制转换使它可用。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top