【问题标题】:getchar() loop doesn't end from no reasongetchar() 循环不会无缘无故地结束
【发布时间】:2018-03-30 11:24:27
【问题描述】:
我有这个代码sn-p:
char key[32];
for (int i = 0; i < 32; i++)
{
key[i] = getchar();
}
这显然应该接受32 个字符然后停止。
问题是它不会在i = 32 处停止,而是一直持续到(出于某种未知原因)我按下回车键。
你能解释一下为什么会这样吗?
【问题讨论】:
标签:
c
string
infinite-loop
getchar
【解决方案1】:
一直持续到(出于某种未知原因)我按下回车键。
是的,这很正常。参见例如http://c-faq.com/osdep/cbreak.html:
计算机程序的输入通常要经过几个阶段。在最低级别,操作系统中与设备相关的例程处理与特定设备(如键盘、串行线路、磁盘驱动器等)接口的细节。在此之上,现代操作系统倾向于具有与设备无关的 I/O 层,统一访问任何文件或设备。最后,C 程序通常通过 stdio 库的可移植函数与操作系统的 I/O 设施隔离开来。
在某种程度上,交互式键盘输入通常会被收集并一次一行地呈现给请求程序。这使操作系统有机会以一致的方式支持输入行编辑(退格/删除/擦掉等),而无需将其内置到每个程序中。只有当用户满意并按下 RETURN 键(或等效键)时,该行才可用于调用程序。即使调用程序似乎一次读取输入一个字符(使用getchar 等),第一次调用也会阻塞,直到用户键入整行,此时可能有许多字符可用并且许多字符请求(例如getchar 调用)很快就得到满足。