我们有一个包含字符流的字符缓冲区。我们一次阅读每个角色并使用isprint
进行检查。在某些时候读取isprint
对于不可打印的字符返回true。我们打印了该字符的十进制值 - -92
- 但是isprint
在Solaris上为此返回TRUE。
for (int lix = 0; lix < l_len; ++lix) {
int lch = l_buf[lix];
if (isprint(lch) && !isspace(lch)) {
fputc(lch, l_fp);
}
else {
fprintf(l_fp, "\\%03o", lch);
}
}
l_buf
的类型为const char*
,包含字符流。isprint
返回AIX上的false
和Solaris上的true
。答案 0 :(得分:8)
如果函数isprint()
的参数(int
类型的参数不能表示为unsigned char
或等于EOF,则行为未定义。
7.4字符处理
- 标头声明了几个对分类和映射有用的函数 字符。在所有情况下,参数都是一个int,其值应为 可表示为无符号字符或等于宏EOF的值。如果 参数有任何其他值,行为未定义。
醇>
答案 1 :(得分:5)
来自cppreference,&#34;如果ch的值不能表示为unsigned char且不等于EOF,则行为未定义。&#34;
在您的情况下,EOF似乎不是-92。
答案 2 :(得分:0)
我建议将lch
的类型更改为 unsigned char 并调用函数isprint,如下所示:isprint(lch & 0xff);
这应该可以解决您的问题,因为 isprint 的手册页说该函数在输入上使用 unsigned char 。
& 0xff
不是必需的,但这是一个很好的衡量标准。