【问题标题】: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 调用)很快就得到满足。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-06
    • 1970-01-01
    • 1970-01-01
    • 2023-03-10
    相关资源
    最近更新 更多