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

相关文章

来自专栏Ryan Miao

js基础-表单验证和提交

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

76050
来自专栏吴伟祥

Velocity语法大全 转

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

7340
来自专栏木子昭的博客

css进阶 less的使用

less 官网http://lesscss.org/ ? less.png npm install -g less # 查看版本 lessc -v 编写les...

42460
来自专栏柠檬先生

sass 基础——回顾

1.webstorm 自动编译SASS   下载安装包 http://rubyinstaller.org/downloads/   然后点击安装,路径为默认路...

24670
来自专栏软件开发

前端MVC Vue2学习总结(二)——Vue的实例、生命周期与Vue脚手架(vue-cli)

一、Vue的实例 1.1、创建一个 Vue 的实例 每个 Vue 应用都是通过 Vue 函数创建一个新的 Vue 实例开始的: var vm = new Vue...

58570
来自专栏互联网杂技

jQuery插件开发全解析

jQuery插件的开发包括两种: 一种是类级别的插件开发,即给jQuery添加新的全局函数,相当于给jQuery类本身添加方法。jQuery的全局函数就是属于j...

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

linux下shell技巧

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

11210
来自专栏软件开发

CSS3与页面布局学习总结(七)——前端预处理技术(Less、Sass、CoffeeScript、TypeScript)

CSS不像其它高级语言一样支持算术运算、变量、流程控制与面向对象特性,所以CSS样式较多时会引起一些问题,如修改复杂,冗余,某些别的语言很简单的功能实现不了等。...

25250
来自专栏FreeBuf

XSS编码剖析

作者 0xExploit 0×00 引言 很多不了解html、js编码的童鞋挖掘xss漏洞时,都是一顿乱插,姿势对了,就能获得快感,姿势不对,就么反应。另外在f...

33480
来自专栏GreenLeaves

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

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

21950

扫码关注云+社区

领取腾讯云代金券