【答疑解惑】getchar()与EOF

先看下面的代码:

while((c = getchar()) != EOF){ putchar(c); }

这一段代码是The C Programming Language(Second Edition)中一个经典的代码,很多初学者在看到这段代码时会有不少疑问,这里做一个简单的总结。

一、getchar的两点总结

getchar是以行为单位来读取的。

当调用getchar函数读取输入时,只有当输入字符为换行符'/n'或文件结束符EOF时,getchar才会停止执行。这句话的意思比如我们运行上面那段代码时,我们输入的是回车键或者EOF(linux下是按下Ctrl+D,windows下是按下Ctrl+Z)是,getchar才结束,而不是像它的名字一样,输入一个字符getchar就返回了。所以输入abc回车,putchar(c)会输出abc和一个回车。这是一个初学者经常会迷惑的点。

getchar的返回值

getchar()的返回值一般情况下是非负 值,但也可能是负值,即返回EOF。这个EOF在函数库里一般定义为-1。正确的定义方法如下(K&R C中特别提到了这个问题):

int c; c = getchar();

二、EOF总结

在这个实例中,EOF并不是在任何情况下都作为文件结束符的。也就是说按下Ctrl+Z或者Ctrl+D不是任何时候都会结束这个循环的。只有在getchar等待全新的输入时直接按下Ctrl+Z或者Ctrl+D才是文件结束,这个时候才会结束循环。

例如在输入abc后按下Ctrl+Z或者Ctrl+D,会是下面的打印:

abcabc

第一组abc是你从终端输入的,然后输入Ctrl+D,getchar逐个字符读取并逐个输出打印出第二组abc,同时光标停在第二组字符的c后面,然后可以进行新一次的输入。

原文发布于微信公众号 - 程序员互动联盟(coder_online)

原文发表时间:2015-08-14

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏听雨堂

Mapx自带的工具的理解

         Mapx自带了很多工具,可以轻松实现mi中很多的功能。但一进入具体应用,仍然有很多的问题。          1、能直接用的:选择,缩放   ...

1807
来自专栏進无尽的文章

实践-小细节 Ⅰ

     开发中总有一些细枝末节的东西是容易出错的地方,搜集总结下,避免再次掉入坑中。

652
来自专栏我和未来有约会

flash读取XML 背景自动适应大小

var bg = new Object(); bg.bgdoc_xml = new XML(); bg.parse_XML = function() {    ...

1955
来自专栏向治洪

Markdown对应Yelee主题语法

概述 这里说的是Yelee主题的语法和原生语法是有些区别的;更多的基础语法可以到Cmd Markdown上面去查看;但是我觉得都会各有不同吧 注意这里说的不是真...

1716
来自专栏企鹅号快讯

不到200行 JavaScript 代码如何实现富文本编辑器

作者:吴锴 http://www.wukai.me/2017/12/31/rich-text-editor-in-less-than-200-lines-jav...

1797
来自专栏守望轩

Visual Studio 2008 每日提示(二十二)

#211、在对象浏览器向前和向后导航 原文链接:The Object Browser has a navigate forward and navigate ...

3428
来自专栏谈补锅

html之file标签 --- 图片上传前预览 -- FileReader

记得以前做网站时,曾经需要实现一个图片上传到服务器前,先预览的功能。当时用html的<input type="file"/>标签一直实现不了,最后舍弃了这个标...

842
来自专栏三流程序员的挣扎

Flutter 学习记2 - 首个应用

void main() 是入口方法,=> 用于单行方法,就是函数签名和函数体间的连接符号,感觉作用和 Kotlin 的单行函数体用 = 类似。既然这样,把代码修...

911
来自专栏Android知识点总结

3-AIV--使用ContentProvider获得所有图片路径

672
来自专栏Java成神之路

为博客园添加目录的方法总结

参考链接: http://www.cnblogs.com/xdp-gacl/p/3718879.html#2937655 http://www.cnblog...

862

扫码关注云+社区