gpt4 book ai didi

c - K&R 练习 1.9 - 无限循环编程

转载 作者:太空宇宙 更新时间:2023-11-04 03:34:46 26 4
gpt4 key购买 nike

我正在尝试在 K&R 中完成练习 1-9,我想到了这个:

#include <stdio.h>

/* this program will trim each group of spaces down to a single space */
int main()
{
int c, lastCharblank;
lastCharblank = 0;

while ((c = getchar()) != EOF) {
if (c != ' ' || !lastCharblank)
putchar(c);

lastCharblank = (c == ' ');
}

putchar('\n');

return 0;
}

在通过 bash 命令行运行程序时,我可以输入文本(“修复这些空格”),然后输入 cntl-d 以发出 EOF 信号。该程序返回所有空格都已更正的行,但它不会退出。它似乎陷入了无限循环。为什么不退出?

最佳答案

这是由于在 POSIX 标准中指定了读取系统调用的方式。 http://pubs.opengroup.org/onlinepubs/9699919799/

When EOF is received, all the bytes waiting to be read are immediately passed to the process without waiting for a newline, and the EOF is discarded. Thus, if there are no bytes waiting (that is, the EOF occurred at the beginning of a line), a byte count of zero shall be returned from the read(), representing an end-of-file indication

I/O 库中的

getchar 是使用面向行的读取系统调用实现的。这意味着 read() 一次向调用者传递一行。 I/O 库将 read() 返回的字节存储在缓冲区中,在 getchar 的情况下,一次向进程传送一个字节。

read() 是面向行的这一事实导致 Cntl-D 的不同行为取决于输入是否在一行的开头。根据规范,行首的 Cntl-D 会立即发出 EOF 信号。

然而,在一行中间的 Cntl-D 表现不同。它将剩余的字节发送到进程并丢弃 EOF。这就是为什么需要另一个 Cntl-D 来向进程发送 EOF 信号。

关于c - K&R 练习 1.9 - 无限循环编程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33470837/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com