如何告诉 `getchar()` 回到缓冲区的开头?
How to tell `getchar()` to go back to the beginning of the buffer?
我正在从 "The C Programming Language" 学习 C,我 运行 进入了 getchar()
的东西,这让我很困惑。显然,当我在程序中调用 getchar()
时,输入的文本被存储在一个缓冲区中,然后 getchar()
一个一个地读取这个缓冲区中的字符,直到它看到 EOF
。我可以指示 getchar()
在同一个缓冲区上第二次执行此过程吗?例如,下面程序中的第二个循环对我来说不会 运行 。是否可以在第一个循环后"reset"getchar()
?
#include <stdio.h>
int main()
{ int c,d;
c = d = 0;
while((c = getchar()) != EOF) printf("foo");
while((d = getchar()) != EOF) printf("bar");
}
缓冲的不是getchar()
,而是您的终端。一旦您按下 Enter,终端会立即将您键入的整行 发送到您的程序。从你的程序的角度来看,没有缓冲,你只是静坐十秒钟,然后眨眼输入一个完整的句子。
您可以通过制作一个 getchar()
的循环并立即输出它收到的字符来验证:输出将 不会 与输入交错,它只会在您按下 Enter.
后出现
因此,如果你想重用你知道的缓冲区,你需要你的程序通过 fgets()
将它读入它一侧的实际缓冲区,然后根据需要使用该缓冲区。
为简单起见,getchar() 不在缓冲区中读取,而是在键盘输入流中读取,通常称为 stdin(标准输入)。
getchar() 不会从流中查看一个字符,但是 消耗 每个调用的一个字符,这意味着 读取和删除流中的字符。
因此,当您在流的末尾时,您会得到一个 eof(文件末尾),通知您其中没有更多字符。
那么 stdin 通常是 行缓冲 意味着完整的输入行,一系列由换行符终止的字符,在时间可用。
我正在从 "The C Programming Language" 学习 C,我 运行 进入了 getchar()
的东西,这让我很困惑。显然,当我在程序中调用 getchar()
时,输入的文本被存储在一个缓冲区中,然后 getchar()
一个一个地读取这个缓冲区中的字符,直到它看到 EOF
。我可以指示 getchar()
在同一个缓冲区上第二次执行此过程吗?例如,下面程序中的第二个循环对我来说不会 运行 。是否可以在第一个循环后"reset"getchar()
?
#include <stdio.h>
int main()
{ int c,d;
c = d = 0;
while((c = getchar()) != EOF) printf("foo");
while((d = getchar()) != EOF) printf("bar");
}
缓冲的不是getchar()
,而是您的终端。一旦您按下 Enter,终端会立即将您键入的整行 发送到您的程序。从你的程序的角度来看,没有缓冲,你只是静坐十秒钟,然后眨眼输入一个完整的句子。
您可以通过制作一个 getchar()
的循环并立即输出它收到的字符来验证:输出将 不会 与输入交错,它只会在您按下 Enter.
因此,如果你想重用你知道的缓冲区,你需要你的程序通过 fgets()
将它读入它一侧的实际缓冲区,然后根据需要使用该缓冲区。
为简单起见,getchar() 不在缓冲区中读取,而是在键盘输入流中读取,通常称为 stdin(标准输入)。
getchar() 不会从流中查看一个字符,但是 消耗 每个调用的一个字符,这意味着 读取和删除流中的字符。 因此,当您在流的末尾时,您会得到一个 eof(文件末尾),通知您其中没有更多字符。
那么 stdin 通常是 行缓冲 意味着完整的输入行,一系列由换行符终止的字符,在时间可用。