while(scanf("%d",&n)!=EOF)与while(cin>>n)
我们知道scanf函数是C语言里面的,其返回值是,被输入函数成功赋值的变量个数。针对于int counts = scanf("%d",&n);来说如果赋值成功那么其返回值为1,即counts的值也是1。例如下面这个例子:
- int c,b;
- int counts = scanf("%d %d", &c, &b);
- cout << counts;
while(条件语句);如条件语句为真,那么循环可以一直进行下去,如果为假则循环结束。就while(scanf("%d",&n)!=EOF)而言,由于EOF(end of file)是文件尾尾标符,它的值为-1,那么scanf("%d",&n)的返回值为1的话,该条件语句为真,循环将会进行下去;如果条件不成立,则跳过该循环,直接执行后面的语句。
对于while(cin>>n)来说,cin是C++的输入流对象,">>"是重载的运算符,cin>>的返回值是cin对象。如istream & operator >> (istream &is, char a[]);下面可以看一个例子:
- int _tmain(int argc, _TCHAR* argv[])
- {
- int len = ;
- char a[];
- while (cin >> a || cin >> len)
- {
- cout << a << endl;
- cout << len <<endl;
- }
- return ;
- }
输入 qq 和 0时,结果如下:
这个结果为什么是这样,它是如何得到的呢?其实是这样的:当我们输入qq和0时,其中间是用空格隔开的,这样cin>>qq之后返回cin对象再对0进行读取,后面的cin>>len并没有执行。所以while循环将会执行两次,一次是a[] = "qq",另一次是a[] = "0";这样才会出现以上的结果。
如果将while (cin >> a || cin >> len)改成while (cin >> a >> len),执行结果如下:
相信这个结果大家就好理解了。
下面对cin再做一下介绍,当我们从键盘输入一串字符
输入(cin)缓冲是行缓冲。当从键盘上输入一串字符并按回车后,这些字符会首先被送到输入缓冲区中存储。每当按下回车键后,cin 就会检测输入缓冲区中是否有了可读的数据,这种情况下cin对键盘上是否有作为流结束标志CTRL+Z或者CTRL+D,其检查的方式有两种:阻塞式以及非阻塞式。
阻塞式检查方式指的是只有在回车键按下之后才对此前是否有 Ctrl+Z 组合键按下进行检查,非阻塞式样指的是按下 Ctrl+D 之后立即响应的方式。如果在按 Ctrl+D 之前已经从键盘输入了字符,则 Ctrl+D的作用就相当于回车,即把这些字符送到输入缓冲区供读取使用,此时Ctrl+D不再起流结束符的作用。如果按 Ctrl+D 之前没有任何键盘输入,则 Ctrl+D 就是流结束的信号。
阻塞式的方式有一个特点:只有按下回车之后才有可能检测在此之前是否有Ctrl+Z按下。
- int _tmain(int argc, _TCHAR* argv[])
- {
- char a[];
- while (cin >> a)
- {
- cout << a << endl;
- }
- return ;
- }
输入数据为Ctrl+D和Ctrl+Z,结果如下:
while(scanf("%d",&n)!=EOF)与while(cin>>n)的更多相关文章
- while(scanf("%d",&n)!=EOF) / while(cin>>n)终止问题
问题的发现:(想要看干货可以直接跳过这段) 我最近刚了解到关于栈的用法,于是按照参考书寻找代码,并把它敲到电脑上.编译运行代码后发现无法终止,在网上查找各种资料,总结如下. 因为我的电脑是Window ...
- 7-16 一元多项式求导(20 分)(有关while(scanf("%d",&n)!=EOF))
7-16 一元多项式求导(20 分) 设计函数求一元多项式的导数. 输入格式: 以指数递降方式输入多项式非零项系数和指数(绝对值均为不超过1000的整数).数字间以空格分隔. 输出格式: 以与输入相同 ...
- 深入浅出scanf、getcha、gets、cin函数
转:问题描述一:(分析scanf()和getchar()读取字符) scanf(), getchar()等都是标准输入函数,一般人都会觉得这几个函数非常简单,没什么特殊的.但是有时候却就是因为使用这些 ...
- 基础 - 字符读取函数scanf、getchar、gets、cin(清空缓存区解决单字符回车问题)
0x01 scanf.getchar.cin读取单字符: 如下: //scanf读取字符 回车问题 void Sub_1_1() { char v1,v2; scanf("%c", ...
- while(scanf("%d",&n)!=EOF)
scanf的返回值由后面的参数决定 scanf("%d%d", &a, &b); 如果a和b都被成功读入,那么scanf的返回值就是2 如果只有a被成功读入,返回值 ...
- HDU 5083 Instruction --模拟
题意:给出汇编指令,解释出编码或者给出编码,解释出汇编指令. 解法:简单模拟,按照给出的规则一步一步来就好了,主要是注意“SET”的情况,还有要输出的东西最好放到最后一起输出,中间如果一旦不对就可以及 ...
- POJ1276Cash Machine
http://poj.org/problem?id=1276 题意 : 给你一个目标钱数,再给你钱币的种数和钱币的面值,让你用这些钱凑出不大于目标钱数的钱然后输出这个最接近且不大于目标钱数的钱. 思路 ...
- 前缀 树 背单词(Remember the Word,LA 3942)
已哭瞎. 搞了2个多小时的错误居然是在 没有初始化............教训:每个例子一定要考虑到初始化问题.! 每个节点存了一个数组 该数组记录的有26个大小 0-25分别表示记录表示'a' ...
- poj 3250 Bad Hair Day (单调栈)
Bad Hair Day Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 14883 Accepted: 4940 Des ...
随机推荐
- 【C语言】调整数组使奇数所有都位于偶数前面(改动)
//调整数组使奇数全部都位于偶数前面. //输入一个整数数组.实现一个函数,来调整该数组中数字的顺序使得数组中全部的奇数位于数组的前半部分,全部偶数位于数组的后半部分 #include <std ...
- OSGi中的ServletContext
在OSGi中,不能的bundle分属不同的装载器(Class Loader), 在J2EE 应用中,不同BUNDLE 中的JSP 所相应的ServletContext对象不同,这与通常情况下的应用是不 ...
- python3.3使用tkinter实现猜数字游戏代码
发布时间:2014-06-18 编辑:www.jbxue.com 原文地址:http://www.jbxue.com/article/python/22152.html python3.3使用tk ...
- [sh]shell命令缩写
命令缩写: ls:list(列出目录内容) cd:Change Directory(改变目录) su:switch user 切换用户 rpm:redhat package manager 红帽子打包 ...
- CLR Debug extention
https://github.com/Microsoft/clrmd https://www.nuget.org/packages/Microsoft.Diagnostics.Runtime http ...
- 用c写了个后台扫描
/** * Notice: The program is not debug on internet and not use thread supervene. * date : 6-26 * aut ...
- CDN技术详解笔记
1.影响网络传输的四个因素(1)“第一公里”:网站服务器接入互联网的链路所能提供的带宽.(2)“最后一公里”:用户接入带宽.(3)对等互联关口:不同网络之间的互联互通带宽.(4)长途骨干传输:首先是长 ...
- 每日英语:Burning Question / Does Reading In Dim Light Hurt Your Eyes?
Mom always told us we'd go blind if we read in the dark. Does science back her up? Jim Sheedy, a doc ...
- ny20 吝啬的国度
吝啬的国度 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 在一个吝啬的国度里有N个城市,这N个城市间只有N-1条路把这个N个城市连接起来.现在,Tom在第S号城市,他有 ...
- Django 自带密码加密,自定密码加密方式 及自定义验证方式
在django1.6中,默认的加密方式是pbkdf_sha256,具体算法不表,一直以来用django的自带用户验证都十分顺手,今天有需求,需要修改默认加密方式为md5,具体方法为: 在setting ...