如何打印'\ n','\ t'等可打印字符和字符

时间:2016-12-10 15:38:13

标签: c printing

我正在尝试显示HTTP帧。问题是某些字符无法识别。我使用isprint函数。

这是我创建的功能:

void printAscii(const int dataLength, const char *data){
  if (dataLength <= 0) {
    printf("No data (data length <= 0)\n");
  } else {
    printf("Warning: Unsupported characters are not displayed.\n\n");
    size_t i;
    printf("|- ");
    for (i = 0; i < dataLength; i++) {
      if (isprint(data[i])) {
        printf("%c", data[i]);
      }
      if (data[i] == '\n') {
        printf("|- ");
      }
    }
  }
}

问题是“\ n”和“\ t”等字符也不显示。 我想在我的函数中添加其他条件

  if (isprint(data[i]) || data[i] == '\n' || data[i] == '\t')

但我想知道是否有更“干净”的方式? 我开始C不会太长,所以如果我的功能出错,请不要犹豫。

修改

我的问题可能不够清楚。

我的项目是帧分析器(pcap),我到了HTTP部分。框架仅包含ASCII,因此显示此类框架相对容易。问题是某些字符没有直接显示(例如编码图像)所以我决定忽略这些字符。问题是isprint()字符如'\ n','\ t'等...也没有显示,因此我的显示不那么“漂亮”。

例如,这个HTTP trame:

<ul>
    <li>Foo</li>
    <li>Bar</li>
</ul>

成为:

<ul><li>Foo</li><li>Bar</li></ul>

这是不太明白的。

编辑2

我找到了。此代码可以根据需要运行。

  if (isprint(data[i]) || isspace(data[i]))

非常感谢。

2 个答案:

答案 0 :(得分:1)

我发现了。该代码可以按需工作。

  if (isprint(data[i]) || isspace(data[i]))

–擦除

答案 1 :(得分:0)

由于这些字符的ASCII值是空白区域,因此您不会使用"%c"格式说明符来查看它们。您需要做的是使用printf中的十六进制字符串格式说明符,如下所示:

printf("%x", data[i]);

注意: "%x"(小写)和"%X"(大写)表示显示字符的十六进制值而不是实际的ASCII值。

我还应该注意,以这种方式格式化字符串将为您提供原始数据。这就是它在内存中的样子,或者如果在线上传输它会是什么样子。因此,\n0x0A\t0x09

请参阅以下链接,以获取有关所有说明符含义的绝佳参考。

http://www.cplusplus.com/reference/cstdio/printf/

此外,这是另一个指向ASCII表的链接。

https://www.techonthenet.com/ascii/chart.php

希望这有帮助!