文档章节

getchar() 函数理解

yellow-young
 yellow-young
发布于 2016/10/19 17:16
字数 1104
阅读 27
收藏 0

问题来源:C Primer Plus 第七章 控制语句:程序分支和跳转

以下是作者在阅读本章一段代码时所遇到的问题和理解过程。

   程序清单 7.2 cypher1.c 程序

----------------------------------------------------------------

/* cypher1.c  --- 改变输入,只保留其中的空格  */

#include <stdio.h>

#define SPACE  " "         /* SPACE 相当于 “引号-空格-引号” */

int main (void)

{

    char ch;

 

    ch = getchar();    /* 读入一个字符 */

    while (ch != '\n')  /* 当一行末结束时 */

    {

        if (ch == SPACE)    /* 空格不变 */

          putchar(ch);      /* 不改变这个字符 */

        else

          putchar(ch + 1);  /* 改变其他字符 */

        ch = getchar();     /* 获取下一个字符 */

   }

    putchar(ch);           /* 打印换行字符 */

   system("PAUSE");

   return 0;

}

 

   下面是一个运行示例;

CALL MB HAL.

DBMM NC IBM/

 

阅读此段程序时存在的疑问:

getchar()每次只能读取一个字符,为什么运行示例只有两行?为什么不是交叉出现输入值和打印值?

 

理解过程:

运行示例第一行实际为输入显示行而不是打印出来的行,第二行为打印行。

先看一下网友给出的getchar() 的运行原理:

    这个程序是简单的用getchar获取用户的输入,再输出。getchar一般是两个gechar函数配合循环使用的。分析一下getchar的流程:

    getchar函数有两个全局的变量长度len,和指向缓存区的指针。getchar函数开头就检查缓存区的长度,判断缓存区是否有数据,缓存区没有数据就调用写入缓存的函数,等待用户输入数据,用户键入回车时,数据和回车键都存入了缓存区,缓存区有数据就直接用指针取当前指向的字符,取出一个数据指针就要指向下一个字符。将取出的字符赋给接收字符的变量ch,判断ch的值是否是结束符。不是结束符就输出字符ch。再判断缓存的长度,看看有没有数据,没有数据写入缓存。有数据提取当前指向的数据,再判断是否结束符。

 

        可以看出getchar() 函数是在用户键入 回车键 后才从缓冲区读取字符,而不是每输入一个字符就读取一次。

        在程序清单7.2中,第一个getchar() 函数(while语句前的那个)检查缓存区的长度,判断缓存区是否有数据,缓存区没有数据就调用写入缓存的函数,等待用户键入字符,但是并不在键入字符之后立刻读取,当用户键入换行符时,该换行符与前面键入的所有字符一起被存入缓存区,此时第一个getchar() 函数就直接读取缓存区的第一个字符(本例中为C)赋给ch。

        (要注意的是当用户键入一系列字符和换行符后,本例中运行示例显示的第一行就已经显示在屏幕上了,而且由于最后一个是换行符,接下来屏幕上的输出都将从下一行开始。)

        while判断执行条件是否为真,若为真则执行循环语句,循环语句中的if-else语句通过判断ch的值是否为空格来决定输出,第一个判断中ch等于C,则输出(C+1)即D;之后执行循环内的getchar() 语句,此getchar() 函数检查缓存区的长度,判断缓存区是否有数据,发现缓存区有数据(因为之前的getchar() 函数仅取走第一个字符C,缓存区还剩余字符:ALL MB HAL.'\n'),直接取走缓存区中的第一个字符A(此时缓存区剩余字符:LL MB HAL.'\n'),然后执行判断语句,判断为真,继续执行while循环,根据if-else语句判断结果在屏幕打印出(A+1)即B,;如此循环,当getchar() 函数取走缓存区最后一个字符'\n'(换行符),进行判断是发现为假,跳出while循环,执行循环外putchar() 语句,此时ch='\n',打印出空白一行。

        (运行示例显示的打印结果中的“\”是由输入的“.”加1而来。)

        以上是我对这段代码的理解过程,菜鸟第一次写博客,如果理解的地方有偏差,还请各位大神指教。

        求老司机带我!

© 著作权归作者所有

yellow-young
粉丝 0
博文 1
码字总数 1104
作品 0
长春
私信 提问
getchar()和EOF总结(转载)

大师级经典的著作,要字斟句酌的去读,去理解。以前在看K&R的The C Programming Language(SecondEdition) 第1.5节的字符输入/输出,被getchar()和EOF所迷惑了。可能主要还是由于没有搞清楚g...

长平狐
2013/01/06
53
0
getchar()和EOF总结

getchar()和EOF总结 大师级经典的著作,要字斟句酌的去读,去理解。以前在看K&R的The C Programming Language(SecondEdition) 第1.5节的字符输入/输出,被getchar()和EOF所迷惑了。可能主要还...

YHZhu
2010/07/07
197
0
C Primer Plus(5版)第8章习题讲解(一)

小伙伴们,对C语言编程有疑问的,可以加微信交流:poo_poo或者扫描我的头像,验证时请注明是“知友” C Primer Plus 第五版的第8章的习题3是我觉得是一个很不错的练手习题,考察输入函数、重...

石家的鱼
2017/07/04
0
0
getchar()与getch()

#include <stdio.h>int main(int argc, char** argv){ int c=getchar(); while(c!='q') { if (c=='r') printf("CR"); else if (c=='n') printf("LF"); else printf("%c", c); c=getchar(); }......

小保哥
2015/11/15
101
0
getch() getche() getchar()的区别

1.输入输出缓冲区的概念(C++用的多一些) 我想以一个例子说明,比如我想把一篇文章以字符序列的方式输出到计算机显示器屏幕上,那么我的程序内存作为数据源而显示器驱动程序作为数据目标,...

晨曦之光
2012/04/13
170
0

没有更多内容

加载失败,请刷新页面

加载更多

Google Guava 笔记

一、引言 Guava 是 google 几个java核心类库的集合,包括集合 [collections] 、缓存 [caching] 、原生类型支持 [primitives support] 、并发库 [concurrency libraries] 、通用注解 [common ...

SuShine
28分钟前
7
0
SpringBoot中使用@Value为静态变量赋值并测试是否成功

今天想像普通变量一样如下采用写法取配置的,但取到的是个null。。。 @Value("${test.appKey}")private static String appKey; 才发现不能通过这种方式取配置来给static变量赋值 在网上搜索...

SilentSong
29分钟前
5
0
ECMAScript语句之with 语句

ECMAScript with 语句,用于设置代码在特定对象中的作用域(with运行缓慢,设置了属性值时更加缓慢,最好避免使用with语句) 一、with 语句用于字符串(配合toUpperCase()方法) var a = "C...

专注的阿熊
30分钟前
4
0
Apache Flink 进阶(一):Runtime 核心机制剖析

1. 综述 本文主要介绍 Flink Runtime 的作业执行的核心机制。首先介绍 Flink Runtime 的整体架构以及 Job 的基本执行流程,然后介绍在这个过程,Flink 是怎么进行资源管理、作业调度以及错误...

大涛学长
36分钟前
4
0
7. 整数反转

给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。 示例 1: 输入: 123 输出: 321 示例 2: 输入: -123 输出: -321 示例 3: 输入: 120 输出: 21 注意: 假设我们的环境只能...

苏坡吴
37分钟前
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部