习惯了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()函数的一点理解的更多相关文章

  1. 五,整型变量的读入——scanf函数

    我们先不说变量怎么读入,我们先说说读入是什么?为什么要读入? 先来看一个例子,我现在需要计算两个整数的乘积.先看只用前面学过的内容的实现. #include<stdio.h> int ma ...

  2. 关于js的回调函数的一点看法

    算了一下又有好几个月没写博客了,最近在忙公司android的项目,所以也就很少抽时间来写些东西了.刚闲下来,我就翻了翻之前看的东西.做了android之后更加感觉到手机端开发的重要性,现在做nativ ...

  3. C语言scanf函数详细解释

    原文链接 函数名: scanf 功 能: 执行格式化输入 用 法: int scanf(char *format[,argument,...]); scanf()函数是通用终端格式化输入函数,它从标准 ...

  4. scanf函数

    一. 变量的内存分析 1. 字节和地址 为了更好地理解变量在内存中的存储细节,先来认识一下内存中的“字节”和“地址”. 1> 内存以“字节为单位” 0x表示的是十六进制,不用过于纠结,能看懂这些 ...

  5. opencv笔记5:频域和空域的一点理解

    time:2015年10月06日 星期二 12时14分51秒 # opencv笔记5:频域和空域的一点理解 空间域和频率域 傅立叶变换是f(t)乘以正弦项的展开,正弦项的频率由u(其实是miu)的值决 ...

  6. 关于C中scanf()函数读取字符串的问题

    #include <stdio.h> int main(void) { ]; scanf("%s", s_name); printf("Hello, %s!\ ...

  7. memcpy、memmove、memset及strcpy函数实现和理解

    memcpy.memmove.memset及strcpy函数实现和理解 关于memcpy memcpy是C和C++ 中的内存拷贝函数,在C中所需的头文件是#include<string.h> ...

  8. C语言第五节scanf函数

    变量的内存分析 字节和地址 为了更好地理解变量在内存中的存储细节,先来认识一下内存中的"字节"和"地址". 内存以"字节为单位" 0x表示的 ...

  9. C语言scanf函数详解

    函数名: scanf  功 能: 运行格式化输入  用 法: int scanf(char *format[,argument,...]); scanf()函数是通用终端格式化输入函数,它从标准输入设 ...

随机推荐

  1. tomcat配置数据池

    1->配置servlet.xml 在 <GlobalNamingResources></GlobalNamingResources>中添加<Resource> ...

  2. Jquery EasyUI tabs处理

    一 获取选中的 Tab 1.   // 获取选中的 tab panel 和它的 tab 对象 2.  var pp = $('#tt').tabs('getSelected'); 3.  var ta ...

  3. JavaScript的基本类型总结

    看了让你有收获的JavaScript的基本类型总结   Javascript是一种弱类型语言,没有明确的类型分类:网上分类的方式比较多,个人感觉不比去特别的追究细分是什么什么类型,若是能够明确的分出类 ...

  4. 如何在ASP.NET大型应用系统的模块化开发实现多版本程序集并存支持[转载]

    如何在ASP.NET大型应用系统的模块化开发实现多版本程序集并存支持 这是我最近碰到的一个问题,有一家企业.NET程序员有80多人,产品线很多也很复杂.对于这样的产品,他们采用了模块化开发来实现复用与 ...

  5. MVP社区巡讲

    MVP社区巡讲照片集 今天MVP社区巡讲在北京利星行微软大厦连同SQL PASS社区合办了一次线下活动,这次互动汇集了在北京大多数的微软MVP,他们都是微软认可的有着各微软产品和技术特长的技术专家,无 ...

  6. java异常基础知识点

    @firstmiki 2017年1月12日12:03:32 一.异常的产生和捕获: package Exception; /** * 演示了java中异常的产生和捕获 * @firstmiki */ ...

  7. 机器学习( Machine Learning)的定义

    关于机器学习有两个相关的定义: 1)给计算机赋予没有固定编程的学习能力的研究领域. 2)一种计算机的程序,能从一些任务(T)和性能的度量(P),经验(E)中进行学习.在学习中,任务T的性能P能够随着P ...

  8. List中函数用法 First,FirstOrDefault,Single,SingleOrDefault的区别

    操作符 如果源序列是空的 源序列只包含一个元素 源序列包含多个元素 First 抛异常 返回该元素 返回第一个元素 FirstOrDefault 返回default(TSource) 返回该元素 返回 ...

  9. asp.net mvc ActionResult

    定义在Controller中的Action方法大都返回一个ActionResult对象.ActionResult是对Action执行结果的封装,用于最终对请求进行响应.ASP.NET MVC提供了一系 ...

  10. 初次配置eclipse, jdk, tomcat, maven, mysql, alt+/

    eclipse 官网下载eclipse-inst-win64.exe, 选择安装java ee. jdk 官网下载jdk-8u102-windows-x64.exe, next到底. 接下来配置环境变 ...