【问题标题】:Why can't we print ASCII values from 0 to 31?为什么我们不能打印从 0 到 31 的 ASCII 值?
【发布时间】:2020-04-21 03:22:43
【问题描述】:
#include<stdio.h>
int main()
{
    for(int i=0;i<=31;i++)
        printf("%c",i);
}

当我们尝试运行此代码时,没有任何输出 这是什么原因?

【问题讨论】:

  • 有些值是不可打印的,但您绝对可以打印其中的一些(例如,换行符)。你看过 ASCII 图表吗?
  • 您对End of Transmission 的实际期望输出是什么?为Vertical Tab?
  • 阅读控制字符。正如斯蒂芬所提到的,其中一些是真正可打印的。 en.wikipedia.org/wiki/Control_character 这是 DOS 中的 #1 和 #2(正如 tadman 提醒我的那样):☺☻
  • @enhzflep 在 DOS (Code Page 437) 中不是 ASCII。
  • @tadman - 谢谢。阅读您的(很棒的)答案后,我意识到了我的错误。

标签: c ascii


【解决方案1】:

C 正在打印它们,但也许您的终端没有显示它们。这种区别很重要,因为终端负责解释程序的输出、打印字母、移动光标、更改颜色等。

按照历史惯例,ASCII table 的前 32 个字符被认为是“控制字符”,其中一些是可打印的,一些像退格键可以移动光标,另一些像 BEL 可以让您的终端发出哔哔声。

不同的终端可能会以不同的方式显示这些内容,或者根本不显示。

值得注意的是,ASCII 早于现代“玻璃”终端,这些代码用于在页面上移动打印头。早期的机器使用teletypes 与它们通信,换行会在纸上向下移动一行,回车会将光标移回行首,就像打字机上的物理carriage return 会移动“马车”回到第一列。

这些是相当精密的机电装置,没有任何现代电路,但它们仍然可以处理 ASCII 数据,至少对于那些使用 ASCII 的人来说,因为还有其他字符集,如 EBCDIC 与它们共存ASCII。

由于这些字符从未打算被打印出来,因此它们没有标准的 ASCII 视觉表示。

使用 DOS 中使用的“扩展 ASCII”,为它们定义了 symbols,因为否则这似乎是一种浪费。这些没有控制代码含义,通常您将它们直接写入控制台字符缓冲区以便查看它们。

【讨论】:

    【解决方案2】:

    可以,只是大部分都是non-printable control characters that most shells ignore。如果您通过管道将stdout 传递给一个文件,该文件将包含这些字符,只是shell 不知道如何处理它们。其中一些是由 shell 处理的(例如换行符和退格字符),而另一些则是无意义的(例如传输结束、数据链接转义)并被忽略,或者替换为不同的字符以进行显示(通常是空格或问题)标记等)。

    【讨论】:

    • Shell 不像终端那么在意。
    猜你喜欢
    • 2012-02-25
    • 2022-01-07
    • 1970-01-01
    • 2016-05-06
    • 1970-01-01
    • 1970-01-01
    • 2012-07-14
    • 2021-03-04
    • 1970-01-01
    相关资源
    最近更新 更多