c - 为什么使用 getchar 输入时 putchar 不返回新行?
问题描述
使用 Clang/GCC 编译并在 Linux 上运行:
运行以下代码时,我遇到了出乎我意料的行为:输入单个字符(“X”)时,系统会提示我输入另一个字符(“Y”),大概是因为缓冲区未满。当我输入第二个字符(“Y”)时,putchar 只显示第二个字符(“Y” - 它既不返回第一个“X”,也没有任何新的换行符/换行符)。我认为这是因为 putchar 正在从头到尾读取流,并将缓冲区读取为“[NEW LINE] Y [NEW LINE]”,并且原始“X”已经超出了为三个变量分配的缓冲区. 但是这个从流的末尾到开头的读数似乎与 putchar 的通常行为不一致——如果我输入四个字符“XYZA”
我的第一个问题是我的上述假设是否正确,我的第二个问题是:如果是这样,为什么 putchar 不输出可能在缓冲区中的新行。如果我得到“[NEW LINE] Y [NEW LINE]”作为输出,我会很清楚发生了什么,但我只得到“Y”。这是为什么?putchar 是否修剪空白元素,或者 getchar 是否以某种不会转换为转义序列字符的方式读取新行?
我尝试了多种使用回车键的组合,但看不到这是如何工作的。我想知道它在做什么。
int main() {
int a,b,c;
printf("Type three letters: ");
a = getchar();
putchar(a);
b = getchar();
putchar(b);
c = getchar();
putchar(c);
}
运行上述内容时:
如果我输入三个字符,它会返回这三个字符。
如果我输入两个字符(例如“XY”),它会返回两个字符,大概是因为第三个字符是按回车键生成的新行。这确实会在显示“XY”后显示一个新行,这使得以下行为让我更加困惑:
如果我输入一个字符,它会提示我输入另一个字符,当我输入另一个字符时,它只返回第二个字符。为什么是这样?在我看来,它正在从头到尾读取缓冲区并修剪空白,但这似乎不太可能。我不明白这种行为。
即使我从上一个示例中只得到一个字符,这对我来说似乎是因为 putchar 正在从流的末尾读取到开头,当输入四个字符时,它应该从头到尾读取:如果我输入四个characters 它返回缓冲区中的前三个字符。
解决方案
stdin
通常是行缓冲的。getchar()
在输入之前,什么都不会给第一个'\n'
。
也是'\n'
输入的字符之一。
推荐阅读
- c# - 打开或关闭网站维护模式的键值始终重定向到维护页面
- django - 子类化 django-registration ActivationView 总是产生“您提供的激活密钥无效。”?
- java - 如何在自定义页面中使用 HATEOAS
- php - 教义 - 以一对多关系替换项目
- python - 为什么在 NN 训练中 GPU 使用率会很低?
- python - 从 dockerfiles 构建 tensorflow 和 jupyter。浏览器拒绝连接
- karate - 需要一个示例 deno,了解如何使用空手道脚本从头开始使用 gatling 进行性能测试
- angular - 角度 4 - 在 p-datatable 中使用带有 ng-template 的 else 条件。目前模板里面有2个ngif,要避免使用2个ngif
- android - Android - 标签屏幕的一个活动多个片段
- jenkins - 在 jenkins 中配置电子邮件的问题