天天看点

eof怎么结束输入_getchar 怎么和 EOF 纠缠不清了?

各位,今天看了一个典型的代码错误,比较有代表性,而且这也是大多数人在C编程中经常忽略的问题之一,拿出来与大家分享,希望大家以后避免类似的错误,代码如下:

char c;while((c=getchar())!=EOF){...}
           

这段代码的本意是用getchar函数读取缓冲区字符直到结束,但是在编译运行时,发现上面几行代码一直报错!逻辑上没问题啊,那这究竟错在哪里?读者可以自己思考一下再往下看。

其实产生报错的原因有两点,一个是对getchar函数理解不到位,另一个是EOF的问题。

我们首先来说说getchar函数的问题,标准库中给出了该函数的使用说明:在它读取一个字符后,会将其转换为int类型返回,所以首先char c要改为int c,关于getchar的问题还没讲完,后面还要说。

我们接着来看看EOF的问题,初学者对它的理解经常会有偏差:首先它是一个宏,定义于头文件,为-1;其次它并不是很多人理解的文件结束符,实际上它是一个标志位,区别于其他所有字符的存在,表示一种没有其他字符的信号。

讲到这里,我们再回到getchar函数,由上面可以看出它的返回值必须是一个能包含所有字符的数据类型,方便它表示任意字符和EOF等标志位。

因此,上面代码的错误就很明显了,可能有两种情况:

1.如果编译器中的char是有符号的且EOF被定义为-1,而恰好有字符等于0xff,那么getchar就会提前结束。当然,如果输入全部是7位以下的字符,那很长时间不会有错误。

2.如果编译器中的char是无符号的,则实际的EOF值会被截断,不再会识别为EOF,将会陷入无限循环。

这里肯定会有人问我们键入-1来模拟EOF跳出循环不行吗?实际上是不行的,-1是有-和1两个字符组成的,而getchar一次只能读取一个字符,所以上述代码EOF与从键盘输入的字符无关,那这岂不是只能死循环了?当然不是,我们可以通过按键组合ctrl+d或者ctrl+z来指示结束,当然,这里的按键组合输入只是我们的一种约定,不应该显示检查按键组合的值。

讲到这里大家应该明白了吧,希望对大家有所帮助,感谢耐心阅读!

eof怎么结束输入_getchar 怎么和 EOF 纠缠不清了?