c - 为什么 getchar() 函数在循环中的工作方式不同?
问题描述
#include <stdio.h>
int main()
{
char c;
while ((c=getchar()) != EOF)
putchar(c);
}
为什么当我输入诸如“omar”之类的文本时,将char print“omar”放回去。它不应该重复打印'o',因为getchar只会采用第一个字符。我知道我可能是因为我错了不知道 getchar 或 putchar 究竟是如何工作的,所以有人可以解释一下它们是如何工作的。另一个问题为什么 getchar 和 putchar 在没有 while 循环的情况下正常工作,但在 while 循环内部的行为是不同的。
解决方案
为什么 getchar() 函数在循环中的工作方式不同?
我带你问为什么getchar()
工作方式与你预期的不同,而不是在其他情况下不同。如果您实际上是指后者,那么答案将是“不是”。
但当然,从流中读取字符,无论是通过getchar()
还是其他 I/O 函数,都会将其从流中删除。 getchar()
如果它不这样做就不会很有用。因此,如果您重复调用它,您将依次读取(并删除)每个字符,直到并且除非所有可用字符都被消耗完。您可以通过将程序中的循环替换为多个连续getchar()
调用来测试这一点。
而且,当然,您的循环确实会重复调用它。循环控制表达式 ,(c=getchar()) != EOF
在循环的每次迭代之前进行评估,这涉及调用getchar()
(而不是使用该函数先前返回的值)。
在完全独立的注释中,请注意getchar()
返回 type 的结果int
,以便它可以返回至少一个值,EOF
,即超出 type 的范围unsigned char
。如果将结果转换为类型,char
则要么有一个实际输入值会误认为 EOF,要么永远不会检测到 EOF,具体取决于char
是有符号还是无符号。要可靠且可移植地检测文件的结尾,您必须将该返回值处理为,int
而不是char
。
推荐阅读
- database - 让发布返回修改/“假”/非数据库数据,客户端仍然可以查询
- electron - 拖动到顶部时电子无框窗口自动最大化(Windows 7)
- docker - Private Docker Registry: 'x509: certificate signed by unknown authority' 仅适用于 Windows 映像
- laravel - Laravel 通知(一键获取详细信息)
- php - mysqli准备好的语句php
- javascript - 使用 javascript 删除重复值
- java - 摆动丢失异常
- java - 嗨,我可以在他或她在线时显示用户状态吗?反之亦然,在 android 中使用 firebase 可以显示用户状态吗?
- selenium - 从另一个 @Test 方法调用时如何在 TestNG 报告中显示 @Test 结果。请提出答案
- javascript - 拆分JS字符串正则表达式大写后跟小写