关于getchar的一些思考
这个问题是有一段代码引起的:
代码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的一些思考的更多相关文章
- 关于while((c=getchar()))的一些应用与思考
最近做题发现一个特别牛逼又特别神奇的读取入字符串的方法 while((c=getchar())!=....) { //do something } 为什么说强大呢,首先这个表达式对空格回车都不怕,他不 ...
- 《ODAY安全:软件漏洞分析技术》学习心得-----shellcode的一点小小的思考
I will Make Impossible To I'm possible -----------LittleHann 看了2个多星期.终于把0DAY这本书给看完了,自己动手将书上的实验一个一个实现 ...
- 转:c语言EOF是什么?(及getchar()和putchar用法)
我学习C语言的时候,遇到的一个问题就是EOF. 它是end of file的缩写,表示"文字流"(stream)的结尾.这里的"文字流",可以是文件(file) ...
- 洛谷P1144 最短路计数 及其引申思考
图论题目练得比较少,发一道spfa的板子题目- 题目:P1144 题目描述 给出一个N个顶点M条边的无向无权图,顶点编号为1-N.问从顶点1开始,到其他每个点的最短路有几条. 输入输出格式 输入格式: ...
- 51nod 1562 玻璃切割 (STL map+一点点的思考)
1562 玻璃切割 题目来源: CodeForces 基准时间限制:1.5 秒 空间限制:131072 KB 分值: 20 难度:3级算法题 现在有一块玻璃,是长方形的(w 毫米× h 毫米),现在要 ...
- 关于KMP的一点思考
关于KMP的一点思考 KMP的\(next\)数组的性质很精妙,有必要开一个坑学习一下 Part 1 啥是next \(next[i]\)表示对于\(pre_i\)这个字符串,这个抠出来的字符串本身后 ...
- 由endl对printf和cout的思考
[前言]二者的区别就不介绍了.二者使用方法: printf("%s",a); cout<<a<<endl; endl的作用是什么? 一.endl作用 众所周 ...
- 领域驱动和MVVM应用于UWP开发的一些思考
领域驱动和MVVM应用于UWP开发的一些思考 0x00 起因 有段时间没写博客了,其实最近本来是根据梳理的MSDN上的资料(UWP开发目录整理)有条不紊的进行UWP学习的.学习中有了心得体会或遇到了问 ...
- 关于面试题 Array.indexof() 方法的实现及思考
这是我在面试大公司时碰到的一个笔试题,当时自己云里雾里的胡写了一番,回头也曾思考过,最终没实现也就不了了之了. 昨天看到有网友说面试中也碰到过这个问题,我就重新思考了这个问题的实现方法. 对于想进大公 ...
随机推荐
- 【转载】获取MAC地址方法大全
From:http://blog.csdn.net/han2814675/article/details/6223617 Windows平台下用C++代码取得机器的MAC地址并不是一件简单直接的事情. ...
- 牛客国庆集训派对Day1:J:Princess Principal(栈模拟求括号匹配)
题目描述 阿尔比恩王国(the Albion Kingdom)潜伏着一群代号“白鸽队(Team White Pigeon)”的间谍.在没有任务的时候,她们会进行各种各样的训练,比如快速判断一个文档有没 ...
- 剑指offer-第四章解决面试题思路之总结
- NOIP2013 DAY2题解
DAY2 T1积木大赛 传送门 题目大意:每次可以选区间[l,r]加1,最少选几次,让每个位置有 它应有的高度. 题解:O(n)扫一遍就好了.后一个比前一个的高度低,那么前一个已经把它覆盖了, 如果高 ...
- JAVA框架--hibernate、struts2、spring
JAVAEE——spring01:介绍.搭建.概念.配置详解.属性注入和应用到项目 JAVAEE——struts2_04:自定义拦截器.struts2标签.登陆功能和校验登陆拦截器的实现 JA ...
- C#防止程序多次运行
经过我的测试,还比较好用,但是有个问题,如果不注销,用另一个用户进入,则程序不能判断出已运行.所以只限于用在单用户环境,还是不太完美. class Program { [STAThread] stat ...
- Arcmap10.1下安装ArcBrutile0.2.2 (Win7)(转)
前阵子换了高级新电脑,用的win7旗舰版装了Arcgis10.1,一直没试过ArcBrutile0.2.2能不能用,今天想用的时候发现自己竟然忘记怎么加载这个工具了!!! 网上搜了一下,度娘今天不 ...
- (转)TextView 设置背景和文本颜色的问题
在做一个项目,突然遇到如下问题 比如:在color.xml中定义了几个颜色 <color name="white">#FFFFFF</color> < ...
- Host ASP.NET WebApi in Owin
什么是OWIN Owin其实是微软为了解耦.Net Web app对IIS的依赖而制定的一套规范,规范定义了Web Server与Web App之间的接口,这样Web App就可以Host在所有兼容O ...
- sed 相关
sed中,a命令是指在匹配的位置后面插入新的内容. c命令是说将在匹配模式空间的指定行用新文本加以替代.