这是我第一次在这里发帖,所以希望这可以按照预期进行。
我正在做一个K& R的早期练习。目标是使用getchar()从用户那里获取一堆字符,然后使用putchar()打印它们,但跳过任何多余的空格。我对练习的解决方案效果很好,但我不明白为什么。
以下是该计划:
#include <stdio.h>
int main()
{
int c, spc;
c = 0;
spc = 0;
while(c != EOF)
{
c = getchar();
if(c == ' ')
{
if(spc != 1)
{
putchar(c);
spc = 1;
}
}
if(c != ' ')
{
spc = 0;
putchar(c);
}
}
return 0;
}
只有一个循环,并且当第一次迭代按预期命中getchar()时执行停止。一旦按下回车符,程序就会打印出用户键入缓冲区的任何内容,没有额外的空格 - 正是它应该做的事情。
但是我不明白为什么当执行getchar()时执行不会随循环的每次后续迭代而停止。 / n角色是否与它有关?我注意到它也打印了换行符,并且在打印完所有内容之后它再次停止在getchar()。那么,为什么在每个迭代开始时跳过getchar()同时在缓冲区中打印所有内容?
我已经和C玩弄了很长时间,但直到最近才努力以“正确”的方式学习它。由于我有一些经验,你不必愚蠢地回答太多(所以,就像你将它解释为10岁而不是5岁)。
答案 0 :(得分:4)
当您输入内容并按Enter键时,所有内容都存储在内部缓冲区中。所以每次循环执行时,它会点击getchar
* 做* 进入该缓冲区并拉出一个字符。
但我不明白为什么执行不会因为每一个而停止 循环的后续迭代
仅当getchar
在该缓冲区中找不到任何内容时,程序才会停止。
现在\n
在这种情况下没有什么特别之处。这只是惯例,CLI实际上并没有“发送”你输入的内容,直到你点击返回(即你可以点击退格等等)。
答案 1 :(得分:0)
while (c != EOF)
后 EOF
结束。一些输入后尝试按Ctrl + D
。