对于solaris上的不可打印字符,'isprint'返回true

时间:2016-03-29 09:03:58

标签: c++ c solaris

我们有一个包含字符流的字符缓冲区。我们一次阅读每个角色并使用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*,包含字符流。
  • 此缓冲区中的数据来自套接字读取。
  • 完全相同的代码在AIX上运行良好;对于缓冲区中特定索引上的字符,isprint返回AIX上的false和Solaris上的true

3 个答案:

答案 0 :(得分:8)

如果函数isprint()的参数(int类型的参数不能表示为unsigned char或等于EOF,则行为未定义。

  

7.4字符处理

     
      
  1. 标头声明了几个对分类和映射有用的函数   字符。在所有情况下,参数都是一个int,其值应为   可表示为无符号字符或等于宏EOF的值。如果   参数有任何其他值,行为未定义。
  2.   

答案 1 :(得分:5)

来自cppreference,&#34;如果ch的值不能表示为unsigned char且不等于EOF,则行为未定义。&#34;

在您的情况下,EOF似乎不是-92。

答案 2 :(得分:0)

我建议将lch的类型更改为 unsigned char 并调用函数isprint,如下所示:isprint(lch & 0xff);
这应该可以解决您的问题,因为 isprint 的手册页说该函数在输入上使用 unsigned char & 0xff不是必需的,但这是一个很好的衡量标准。