【答疑解惑】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 条评论
登录 后参与评论

相关文章

来自专栏SHERlocked93的前端小站

Vue源码阅读 - 文件结构与运行机制

vue已是目前国内前端web端三分天下之一,同时也作为本人主要技术栈之一,在日常使用中知其然也好奇着所以然,另外最近的社区涌现了一大票vue源码阅读类的文章,在...

1113
来自专栏自动化测试实战

《selenium2 python 自动化测试实战》(7)——定位一组对象

2905
来自专栏cloudskyme

使用jquery-easyui写的CRUD插件(1)

写插件先看看jqeury的插件如何写,先了解一下如何写插件的代码。 jQuery插件的开发包括两种: 一种是类级别的插件开发,即给jQuery添加新的全局函数,...

3799
来自专栏GreenLeaves

JS框架设计之加载器所在路径的探知一模块加载系统

1、要加载一个模块,我们需要一个URL作为加载地址,一个script作为加载媒介,但用户在require是都用ID,我们需要一个将ID转换为URL的方法,思路很...

2015
来自专栏吴伟祥

Velocity语法大全 转

本文转载自:http://www.cnblogs.com/codingsilence/archive/2011/03/29/2146580.html

564
来自专栏IMWeb前端团队

移动端minimvvm框架qvm实现

gitHub地址 1,移动端minimvvm框架qvm实现 qvm概念,一个适用于移动端的mini mvvm(什么是mvvm?没了解的同学自己去了解)框架。参考...

21510
来自专栏Ryan Miao

js基础-表单验证和提交

基础知识: 原始提交如下: 1 <form action="/login" method="post" id="form1"> 2 <span>用户<...

4105
来自专栏帘卷西风的专栏

linux下shell技巧

    经常看到一些大牛操作linux的时候,双手运指如飞,指令如流水般输出,会不会感到羡慕呢?

641
来自专栏Nian糕的私人厨房

jQuery ele.find() is not a function 错误的解决办法

这又是在项目过程中所遇到的一个问题,ele.find() is not a function,其中 HTML 代码如下所示:

945
来自专栏HTML5学堂

原生JS | 通过类名获取标签

HTML5学堂(码匠):在原生JavaScript当中,存在默认的getElementsByClassName()方法,在不支持该方法的浏览器中,又应该怎么实现...

4106

扫码关注云+社区