C语言getchar()和EOF

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言getchar()和EOF相关的知识,希望对你有一定的参考价值。

怎么第一次ctrl+z没有结束循环,需要第二次ctrl+z才结束呢

感觉是缓冲区的问题
getchar是从缓冲区读取字符
而C程序获取到缓冲区数据的条件是在输入中获取到了换行符或者EOF一类的值
当遇到换行符的时候,会把输入的数据,包括换行符在内,存到缓冲区
当遇到EOF的时候,会把输入的数据,不包括EOF存到缓冲区,除非只有EOF

所以当你在输入abcdf^Z时,abcdf送到缓冲区供getchar读取,但是EOF被忽略了
当下次输入^Z时,由于只有EOF,所以EOF被送到缓冲区并被getchar捕获,导致程序结束

你可以试试输入abcdf后回车,应该同样会打印!!!!! 再输入^Z,同样可以退出程序

一家之言 仅供参考 望有帮助
参考技术A 你好,你的第一次输入的是
while 循环前的 a=getchar() 值是abcdf
在while(a != EOF) 循环判断时 可以理解为这样的 while(abcdf != EOF)
之后在while 循环体内输出!!!!!
接着你二次输入 是在while 里面的这条 语句 a=getchar()
其实这个循环体执行了 5次循环
参考技术B 。。。a应该定义为int型 参考技术C 你想表达什么?

EOF:getchar()函数返回的一个特殊值

EOF 是个宏,其意思是:End Of File,文件尾标志。 从数值上来看,就是整数-1
在C语言的头文件中对其进行了宏定义:
libio.h: # define EOF (-1)
当读文件操作时,遇到文件结束位置或读数据出错均会返回 EOF。 (C语言中所有的输入输出操作均是按读文件的思想来设计的,或者说,是文件操作的一种特例,如getchar()就是fgetc(stdin) 的一个宏 )
int getchar() ;
//从标准输入缓冲区读取一个字符,成功返回该字符的ASCII值,出错,返回EOF
那么,如何在键盘输入时,产生EOF呢? 不同的系统方法不同:
linux系统下,在输入回车换行后的空行位置,按 ctrl+d (先按ctrl键,不放,再按d键)
windows系统下,在输入回车换行后的空行位置,按 ctrl+z,再回车确认
以下代码供参考:
#include <stdio.h>
void main()
{
int ch;
while ( ch!=EOF )
{
ch=getchar();
printf("ch=%d\n", ch ); //输出读返回的ch值,读到EOF会输出-1
}
}

以上是关于C语言getchar()和EOF的主要内容,如果未能解决你的问题,请参考以下文章

在C语言中getchar()如何用

算法练习

c语言getchar的用法

c语言中的getch与getchar 有啥区别?

c语言中(c=getchar())!=EOF与c=getchar()!=EOF的区别?

基于C语言EOF与getchar()的使用详解