关于scanf()函数的一点理解
习惯了c++的cin.cout之后,也不怎么关注空格,反正cin.cout会自动处理。有一次实验,创建Huffman树,要求输入空格字符,当时就懵逼了.cin咋输入空格呢?
没办法,只能重新用scanf函数了,结果各种悲剧,足足debug一个多小时,这难道就是越学越差劲系列?
scanf()和printf()严格来说并不是c的一部分,当我们用scanf()函数输入数据时,只要不回车,数据就暂存在缓冲区。因此我们可以输入一下,回车一下,也可以全部输完再回车,一般来说这两者没啥区别,但遇到字符输入时就需要格外注意了。
比如输入空格和数字。
空格 12(空格的ASCII码值为32)。
代码:
#include <iostream>
#include <stdio.h>
using namespace std; int main()
{
char a;
int b;
scanf("%c %d",&a,&b);
cout<<(int)a<<endl;
cout<<b<<endl;
return ;
}

输入空格和12,然后回车,这显然没什么问题。
在这基础上,我们做一下改动。
#include <iostream>
#include <stdio.h>
using namespace std; int main()
{
char a,a1;
int b,b1;
scanf("%c %d",&a,&b);
scanf("%c %d",&a1,&b1);
cout<<(int)a<<endl;
cout<<b<<endl;
cout<<a1<<endl;
cout<<b1<<endl;
return ;
}
当我们输入a,b后,能不能回车,再输入a1,b1.答案是不能,因为回车被a1给吸收了(o(╯□╰)o)(大一的时候对着明明很清楚的诶,咋忘了呢?)
我们再来做一下改动,我们不想写多个scanf(),改为for循环控制。
代码:
#include <iostream>
#include <stdio.h>
using namespace std; int main()
{
char a;
int b;
int n;
cin>>n;
for(int i=;i<=n;i++){
scanf("%c %d",&a,&b);
cout<<(int)a<<endl;
cout<<b<<endl;
}
return ;
}
大家可能觉得这没什么问题,但输入n之后回车的话,就会悲剧,所以需要在cin>>n后加一个getchar();同时scanf()也要加一个getchar()。
正确的代码:
#include <iostream>
#include <stdio.h>
using namespace std; int main()
{
char a;
int b;
int n;
cin>>n;
getchar();
for(int i=;i<=n;i++){
scanf("%c %d",&a,&b);
getchar();
cout<<a<<endl;
cout<<b<<endl;
}
return ;
}

(ps:嘛,事实上可以用scanf(" %c",&a))这种形式吸收空格和回车(%c前面留个空格))
关于scanf()函数的一点理解的更多相关文章
- 五,整型变量的读入——scanf函数
我们先不说变量怎么读入,我们先说说读入是什么?为什么要读入? 先来看一个例子,我现在需要计算两个整数的乘积.先看只用前面学过的内容的实现. #include<stdio.h> int ma ...
- 关于js的回调函数的一点看法
算了一下又有好几个月没写博客了,最近在忙公司android的项目,所以也就很少抽时间来写些东西了.刚闲下来,我就翻了翻之前看的东西.做了android之后更加感觉到手机端开发的重要性,现在做nativ ...
- C语言scanf函数详细解释
原文链接 函数名: scanf 功 能: 执行格式化输入 用 法: int scanf(char *format[,argument,...]); scanf()函数是通用终端格式化输入函数,它从标准 ...
- scanf函数
一. 变量的内存分析 1. 字节和地址 为了更好地理解变量在内存中的存储细节,先来认识一下内存中的“字节”和“地址”. 1> 内存以“字节为单位” 0x表示的是十六进制,不用过于纠结,能看懂这些 ...
- opencv笔记5:频域和空域的一点理解
time:2015年10月06日 星期二 12时14分51秒 # opencv笔记5:频域和空域的一点理解 空间域和频率域 傅立叶变换是f(t)乘以正弦项的展开,正弦项的频率由u(其实是miu)的值决 ...
- 关于C中scanf()函数读取字符串的问题
#include <stdio.h> int main(void) { ]; scanf("%s", s_name); printf("Hello, %s!\ ...
- memcpy、memmove、memset及strcpy函数实现和理解
memcpy.memmove.memset及strcpy函数实现和理解 关于memcpy memcpy是C和C++ 中的内存拷贝函数,在C中所需的头文件是#include<string.h> ...
- C语言第五节scanf函数
变量的内存分析 字节和地址 为了更好地理解变量在内存中的存储细节,先来认识一下内存中的"字节"和"地址". 内存以"字节为单位" 0x表示的 ...
- C语言scanf函数详解
函数名: scanf 功 能: 运行格式化输入 用 法: int scanf(char *format[,argument,...]); scanf()函数是通用终端格式化输入函数,它从标准输入设 ...
随机推荐
- AOP的成员介绍
AOP(Aspect Oriented Programming)面向切面编程,AOP的作用不过多介绍,本文是主要是介绍AOP的成员,是我在复习的时候记录的一些笔记,方便以后查阅方便一些. JointP ...
- mongDB主从
MongoDB[第二篇]MongodDB主从 官方网站:http://www.mongodb.org/ MongoDB的一些参数 --logpath 日志文件路径 --master 指定为主机器 -- ...
- 从零开始学C++之运算符重载(三):完善String类([]、 +、 += 运算符重载)、>>和<<运算符重载
在前面文章中使用过几次String类的例子,现在多重载几个运算符,更加完善一下,并且重载流类运算符. []运算符重载 +运算符重载 +=运算符重载 <<运算符重载 >>运算符重 ...
- <我的外骨骼,诺基>后的访谈
<我的外骨骼,诺基>后的访谈 在接下采访任务之前,我对杨贵福的了解仅仅限于:有名的科幻作家,男性,成年.我虽然读过他的许多作品,但在这些作品中并不能找到作者的影子.我试着从作品的行文风格中 ...
- Oracle笔记(六) 多表查询
最近看了李兴华的oracle视频,这是网上别人做的笔记非常细致,分享给大家,第六篇 原创地址:http://www.cnblogs.com/mchina/archive/2012/09/07/2651 ...
- 定义文件XML——从简单开始
本文纯属个人见解,是对前面学习的总结,如有描述不正确的地方还请高手指正~ 通过看XML讲授的视频,算是对XML有了简略的认识,原本不盘算写这篇博客,但无法原来视频讲授的内容就少,再不踊跃写些东西,过不 ...
- 酒店管理web项目总结
酒店管理web项目总结 半个月的努力,一个完整的酒店项目也就新鲜出炉了,在项目的制作中总结了一些酒店管理项目的特点. 1.需求分析,酒店管理需要什么? 1)首先系统的安全性,对于任何一个系统来说,安全 ...
- CSS预处理器的对比 — Sass、Less和Stylus
本文根据Johnathan Croom的<sass vs. less vs. stylus: Preprocessor Shootout>所译,整个译文带有我们自己的理解与思想,如果译得不 ...
- servlet的跳转
首先要有RequestDispatcher对象(由request.getRequestDispatcher(根目录)注意不用谢后缀名java RequestDispatcher dispatcher= ...
- hdu1041
#include <iostream> #include <string> using namespace std; const int SIZE = 1001; const ...