我开始阅读" C语言编程语言 "(K&R),我对这个getchar()
功能有所怀疑.
例如这段代码:
#includemain() { int c; c = getchar(); putchar(c); printf("\n"); }
键入toomanychars
+ CTRL+ D(EOF)打印t
.我认为这是预期的,因为它是第一个引入的角色.
但接下来是另一段代码:
#includemain() { int c; while((c = getchar()) != EOF) putchar(c); }
键入toomanychars
+ CTRL+ D(EOF)打印toomanychars
.
我的问题是,如果我只有一个char变量,为什么会这样?其余的字符存储在哪里?
编辑:
感谢大家的答案,我现在开始明白......只有一个问题:
当给定CTRL+ D时,第一个程序退出,而第二个程序打印整个字符串,然后等待更多用户输入.为什么它等待另一个字符串并且不像第一个那样退出?
getchar
从标准输入获取单个字符,在这种情况下是键盘缓冲区.
在第二个例子中,getchar
函数处于一个while
循环中,一直持续到它遇到a EOF
,因此它将保持循环并检索一个字符(并将字符打印到屏幕),直到输入变空.
连续调用getchar
将获得来自输入的连续字符.
哦,不要因为问这个问题而感到难过 - 当我第一次遇到这个问题时,我感到很困惑.
它将输入流视为文件.就好像你打开了一个包含文本"toomanychars"的文件,并一次读取或输出一个字符.
在第一个例子中,在没有while循环的情况下,就像你打开一个文件并读取第一个字符,然后输出它.然而,第二个示例将继续读取字符,直到它获得文件结束信号(ctrl+D
在您的情况下),就像它从磁盘上的文件读取一样.
在回复您更新的问题时,您使用的操作系统是什么?我在我的Windows XP笔记本电脑上运行它并且工作正常.如果我按下回车键,它会打印出我到目前为止的内容,换行,然后继续.(该getchar()
功能在您按Enter键之前不会返回,这是在调用时输入缓冲区中没有任何内容的情况).当我按下CTRL+Z
(Windows中的EOF)时,程序终止.请注意,在Windows中,EOF必须位于其自己的行上才能在命令提示符中计为EOF.我不知道这种行为是否在Linux或任何你可能运行的系统中被模仿.