这个问题是有一段代码引起的:

代码1:

#include<iostream>
using namespace std;
int main()
{
char t;
t=getchar();
cout<<t<<endl;
ungetc(t,stdin);
cin>>t;
cout<<t<<endl;
}

运行结果:

代码2:

#include<iostream>
using namespace std;
int main()
{
int t;
t=getchar();
cout<<t<<endl;
ungetc(t,stdin);
cin>>t;
cout<<t<<endl;
}

运行结果:

(49是‘1’的ascii码)

代码1的结果是很好理解的,但对于代码二的结果很是纳闷,为什么会这样呢?

查了查ungetc和getchar的资料才明白是怎么回事,当然这是我自己的想法,如果有大神有更加深入的了解,欢迎留言,嘿嘿

我们都知道ungetc的作用是将字符t送回缓冲区,而getchar是从输入的缓冲区中获取一个字符;

getchar的特点:

getchar有一个int型的返回值.当程序调用getchar时.程序就等着用户按键.用户输入的字符被存放在键盘缓冲区中.直到用户按回车为止(回车字符也放在缓冲区中).当用户键入回车之后,getchar才开始从stdin流中每次读入一个字符.getchar函数的返回值是用户输入的第一个字符的ASCII码,如出错返回-1,且将用户输入的字符回显到屏幕.如用户在按回车之前输入了不止一个字符,其他字符会保留在键盘缓存区中,等待后续getchar调用读取.也就是说,后续的getchar调用不会等待用户按键,而直接读取缓冲区中的字符,直到缓冲区中的字符读完为后,才等待用户按键.

一个例子:

#include<iostream>
using namespace std;
int main()
{
char a=getchar();
char b=getchar();
cout<<a<<","<<b<<endl;
}

运行结果:

我们一次输入了“123”,都放到了缓冲区中,但是a值获取了第一个字符‘1’,然后对于b我们不用输入,而是自动从缓冲区获取剩下的字符的第一个,即‘2',如果我们再使用一次getchar呢?没错,获取的正是’3’;

我们回到原来的话题:

对于代码1,t 一开始获取了第一个字符‘1’,然后由ungetc将字符‘1’又送回了缓冲区,然后又使用了cin,因为t是char类型的,所以cin只从缓冲区取出了一个字符‘1’,然后赋给了t.

对于代码2,t 一开始获取了第一个字符‘1’,因为是int类型,所以输出了49,然后由ungetc将字符‘1’又送回了缓冲区,然后又使用了cin,因为t是int类型的,所以cin从缓冲区取出了连续的数字,cin用于输入整数的时候,是通过空格和回车进行分割的,所以这里就取出了123并将其赋给了t.

为了验证我们的猜想,我们还是先使用getchar,用户输入一行数据,然后再使用ungetc将首字符送回,然后在使用cin从缓冲区获取数据并赋值给string类型变量,我们知道string类型变量可以获取连续的字符,并且使用cin获取时是通过空格或者回车进行分割的,所以应该跟代码2的结果类似:

#include<iostream>
using namespace std;
int main()
{
char a=getchar();
ungetc(a,stdin);
string str;
cin>>str;
cout<<a<<","<<str<<endl;
}

运行结果:

此处cin从‘a'开始获取数据直到遇到空格,然后将数据赋给了str

还需要说明的是代码2的程序输入,只适用于整数,当输入的是整数字符(’0‘~’9‘)的时候,cin将缓冲区的数据按照整数的格式赋给了int型变量(注意不是类型转换,我能想到的就是cin的时候自动调用了atoi函数);

当输入的是其他字符的时候,cin就不能把缓冲区中的数据赋给int型变量了。

关于getchar的一些思考的更多相关文章

  1. 关于while((c=getchar()))的一些应用与思考

    最近做题发现一个特别牛逼又特别神奇的读取入字符串的方法 while((c=getchar())!=....) { //do something } 为什么说强大呢,首先这个表达式对空格回车都不怕,他不 ...

  2. 《ODAY安全:软件漏洞分析技术》学习心得-----shellcode的一点小小的思考

    I will Make Impossible To I'm possible -----------LittleHann 看了2个多星期.终于把0DAY这本书给看完了,自己动手将书上的实验一个一个实现 ...

  3. 转:c语言EOF是什么?(及getchar()和putchar用法)

    我学习C语言的时候,遇到的一个问题就是EOF. 它是end of file的缩写,表示"文字流"(stream)的结尾.这里的"文字流",可以是文件(file) ...

  4. 洛谷P1144 最短路计数 及其引申思考

    图论题目练得比较少,发一道spfa的板子题目- 题目:P1144 题目描述 给出一个N个顶点M条边的无向无权图,顶点编号为1-N.问从顶点1开始,到其他每个点的最短路有几条. 输入输出格式 输入格式: ...

  5. 51nod 1562 玻璃切割 (STL map+一点点的思考)

    1562 玻璃切割 题目来源: CodeForces 基准时间限制:1.5 秒 空间限制:131072 KB 分值: 20 难度:3级算法题 现在有一块玻璃,是长方形的(w 毫米× h 毫米),现在要 ...

  6. 关于KMP的一点思考

    关于KMP的一点思考 KMP的\(next\)数组的性质很精妙,有必要开一个坑学习一下 Part 1 啥是next \(next[i]\)表示对于\(pre_i\)这个字符串,这个抠出来的字符串本身后 ...

  7. 由endl对printf和cout的思考

    [前言]二者的区别就不介绍了.二者使用方法: printf("%s",a); cout<<a<<endl; endl的作用是什么? 一.endl作用 众所周 ...

  8. 领域驱动和MVVM应用于UWP开发的一些思考

    领域驱动和MVVM应用于UWP开发的一些思考 0x00 起因 有段时间没写博客了,其实最近本来是根据梳理的MSDN上的资料(UWP开发目录整理)有条不紊的进行UWP学习的.学习中有了心得体会或遇到了问 ...

  9. 关于面试题 Array.indexof() 方法的实现及思考

    这是我在面试大公司时碰到的一个笔试题,当时自己云里雾里的胡写了一番,回头也曾思考过,最终没实现也就不了了之了. 昨天看到有网友说面试中也碰到过这个问题,我就重新思考了这个问题的实现方法. 对于想进大公 ...

随机推荐

  1. myeclipse三个地方的java版本统一

    1 java build path 2 java compiler 3 Myeclipse -> project facets

  2. HihoCoder 1068 RMQ-ST算法+BIT

    以前都是用的BIT或者线段树(前者多一些). 对于ST(Sparse Table),在求倍增or公共祖先(LCA)时见过,说明还有其他用处,所以还是学习一下. 首先是预处理,用动态规划(DP)解决. ...

  3. 设计模式之原型(prototype)模式

    相信大多数的人都看过<西游记>,对孙悟空拔毛变出小猴子的故事情节应该都很熟悉.孙悟空可以用猴毛根据自己的形象复制出很多跟自己一模一样的小猴兵出来,其实在设计模式中也有一个类似的模式,我们可 ...

  4. CODEVS4650 破损的键盘

    传送门 题目大意:一个字符串,将[]内的字符提前. 题解:链表,数组元素高效交换 cur表示目前元素插入下标为cur的元素后面. 所以,假设目前把下标为i的元素插到cur后面. 那么,next[i]= ...

  5. Linux修改数据库的访问权限

    以下方法可以帮助你解决这个问题了,下面的语句功能是,建立一个用户为monitor密码admin权限为和root一样.允许任意主机连接.这样你可以方便进行在本地远程操作数据库了. CREATE USER ...

  6. photoshop画矩形款

    1.屏幕截图 2.在photoshop新建图形 3.用矩形选框 4.右键打开描边,宽度设成5个像素

  7. 51nod 1362 搬箱子——[ 推式子+组合数计算方法 ] [ 拉格朗日插值 ]

    题目:http://www.51nod.com/Challenge/Problem.html#!#problemId=1362 方法一: 设 a 是向下走的步数. b 是向右下走的步数. c 是向下走 ...

  8. The type javax.xml.rpc.ServiceException cannot be resolved.It is indirectly

    The type javax.xml.rpc.ServiceException cannot be resolved.It is indirectly 博客分类: 解决方案_Java   问题描述:T ...

  9. sqlserver sql语句附加 分离数据库

    当使用 sp_attach_db 系统存储过程附加数据库时- - Tag: 当使用 sp_attach_db 系统存储过程附加数据库时 //附加数据库 sp_attach_db 当使用 sp_atta ...

  10. 73个word使用终极技巧

    1.问:Word里边怎样设置每页不同的页眉?如何使不同的章节显示的页眉不同? 答:分节,每节可以设置不同的页眉.文件——页面设置——版式——页眉和页脚——首页不同 2.问:请问Word中怎样让每一章用 ...