关于C++的scanf,其实在使用时有一个注意的点。

我们来看一个简单的例子。

对于输入的一行,如果这一行的开头需要输入一个字符,例如这样的输入:

A 10 20
B 30
A 3 50
...

我们可以使用这种方式来读入,使用一段代码来进行试验:

#include<stdio.h>
using namespace std;
int main(){
int n;
scanf("%d",&n);
while(n--){
char c;
scanf("%c",&c);
if(c=='A'){
int a,b;
scanf("%d%d",&a,&b);
printf("%d\n",a+b);
}
else if(c=='B'){
int a;
scanf("%d",&a);
printf("%d\n",a);
}
}
}

应该能看懂,输入A 20 30就是输出20+30的和,输入B 5就是直接输出5,最前面输入的n是次数。

好,运行试验一下:

有人会问,输入的n是5,但是为什么两次就停止了?我们来做个试验:

int main(){
int n;
scanf("%d",&n);
while(n--){
char c;
scanf("%c",&c);
printf("%d\n",c); //这里!
if(c=='A'){
//略
}
else if(c=='B'){
//略
}
}
}

我们同样运行一次,结果是:



红框圈出的位置就是输出。我们可以看到,里面除了正常的'A','B'的ASCII码65,66以外,还有10的出现。

10代表换行符,那么,我们可以知道:

scanf的输入读取,其实是按照连续的字符流为单位进行解读的。读入完一个数后,后面的空格或者换行符还是残留在流中。

例如我输入:"123\n",使用scanf的%d读入,实际上只把123从流中读入了进来,'\n'还残留在流中。

因此,下一次读入%c的时候,就会把\n读进来。

解决方法:

方法一

使用字符串的形式读入,这种情况下,%s不会把残留的\n读入进来。

代码:

#include<stdio.h>
using namespace std;
int main(){
int n;
scanf("%d",&n);
while(n--){
char s[10];
scanf("%s",s);//这里!
if(s[0]=='A'){
int a,b;
scanf("%d%d",&a,&b);
printf("%d\n",a+b);
}
else if(s[0]=='B'){
int a;
scanf("%d",&a);
printf("%d\n",a);
}
}
}

方法二

既然多了一个换行符,那么把这个换行符使用某些方法读掉就可以了,可以使用getchar来,也可以通过scanf的格式说明符来。

代码:

#include<stdio.h>
using namespace std;
int main(){
int n;
scanf("%d",&n);getchar();//这里!
while(n--){
char c;
scanf("%c",&c);
if(c=='A'){
int a,b;
scanf("%d%d",&a,&b);getchar();
printf("%d\n",a+b);
}
else if(c=='B'){
int a;
scanf("%d",&a);getchar();
printf("%d\n",a);
}
}
}

方法三

先使用字符串的形式读入,再使用sscanf解析字符串。这样由于每次读入的字符串会被替换,因此残留的换行符不会造成影响。

#include<stdio.h>
using namespace std;
char s[1000];
int main(){
int n;
fgets(s,1000,stdin);//这里!
sscanf(s,"%d",&n);
while(n--){
char c;
scanf("%c",&c);
if(c=='A'){
int a,b;
fgets(s,1000,stdin);
sscanf(s,"%d%d\n",&a,&b);
printf("%d\n",a+b);
}
else if(c=='B'){
int a;
fgets(s,1000,stdin);
sscanf(s,"%d\n",&a);
printf("%d\n",a);
}
}
}

关于C++ scanf的一个小知识的更多相关文章

  1. Java异常的一个小知识

    有以下两个代码: package com.lk.A; public class Test3 { public static void main(String[] args) { try { int a ...

  2. 从最小角回归(LARS)中学到的一个小知识(很短)

    [转载请注明出处]http://www.cnblogs.com/mashiqi (居然有朋友说内容不接地气,那么我就再加一段嘛,请喜欢读笑话的同学直接看第二段)假设这里有一组向量$\left\{ x_ ...

  3. 关于 JavaScript 字符串的一个小知识

    说起字符串,我们再熟悉不过了.接触编程的第一个经典任务就是输出字符串:Hello, world.但是你知道 JavaScript 字符串在计算机里是怎么表示的吗? 最简单直观但不太准确的的理解就是,字 ...

  4. 一个小知识,shell如何输出换行符号

    一般来说如果在echo里直接写上\n,他不会被转义,必须加上-e参数 echo "hello\n morning" # 输出为 hello\n morning echo -e &q ...

  5. Redola.Rpc 的一个小目标

    Redola.Rpc 的一个小目标 Redola.Rpc 的一个小目标:20000 tps. Concurrency level: 8 threads Complete requests: 20000 ...

  6. 用struts2标签如何从数据库获取数据并在查询页面显示。最近做一个小项目,需要用到struts2标签从数据库查询数据,并且用迭代器iterator标签在查询页面显示,可是一开始,怎么也获取不到数据,想了许久,最后发现,是自己少定义了一个变量,也就是var变量。

    最近做一个小项目,需要用到struts2标签从数据库查询数据,并且用迭代器iterator标签在查询页面显示,可是一开始,怎么也获取不到数据,想了许久,最后发现,是自己少定义了一个变量,也就是var变 ...

  7. 蓝牙Bluetooth技术小知识

    蓝牙Bluetooth技术以及广泛的应用于各种设备,并将继续在物联网IoT领域担任重要角色.下面搜集整理了一些关于蓝牙技术的小知识,以备参考. 蓝牙Bluetooth技术始创于1994年,其名字来源于 ...

  8. HTML+CSS中的一些小知识

    今天分享一些HTML.CSS的小知识,希望能够对大家有所帮助! 1.解决网页乱码的问题:最重要的是要保证各个环节的字符编码一致! (1)编辑器的编辑环境的字符集(默认字符集):Crtl+U 常见的编码 ...

  9. iOS APP开发的小知识(分享)

          亿合科技小编发现从2007年第一款智能手机横空出世,由此开启了人们的移动智能时代.我们从一开始对APP的陌生,到现在的爱不释手,可见APP开发的出现对我们的生活改变有多巨大.而iOS AP ...

随机推荐

  1. Inverse/Implicit Function Theorem

    目录 4.1 The Inverse Function Theorem The Implicit Function Theorem 4.3 Curves and Surfaces 4.4 The Mo ...

  2. Java程序设计基础笔记 • 【第5章 循环结构】

    全部章节   >>>> 本章目录 5.1 while循环结构 5.1.1 循环简介 5.1.2 while循环 5.1.3 while循环的使用 5.1.4 while循环的注 ...

  3. windows下的Python的下载与安装

    Python的下载 Python下载要去官网下载,xdm,这里是网址 www.python.org 因为是外网所以打开下载会慢一些(不要着急的说) 这是python官网界面,跟着图片去下载(因为我这会 ...

  4. Hadoop用户配置免密登陆

    Hadoop用户配置免密登陆, 参考其他免密配置方法自己总结的更简洁的步骤. 要实现A免密登陆B,需要把A生成的公钥放到B的对应目录下, 要实现ABC之间免密登陆,把3者的公钥汇总到一个文件中, 然后 ...

  5. html 基础 audio和video的基础使用

    基础标签 文本格式化标签: 标签 说明 <b></b>/<strong></strong> 加粗 <u></u>/<ins ...

  6. vue中把一个事件绑定到子组件上

    官网上是这样描述的 你可能有很多次想要在一个组件的根元素上直接监听一个原生事件.这时,你可以使用 v-on的 .native 修饰符 父组件App.vue <template> <d ...

  7. win10系统微软账号登陆错误报错误码0x80190001

    https://blog.csdn.net/u012878537/article/details/91353248 使用onenote同步的时候报出这样的错误. 知道问题出在了哪里,就容易解决了不是. ...

  8. Echart可视化学习(七)

    文档的源代码地址,需要的下载就可以了(访问密码:7567) https://url56.ctfile.com/f/34653256-527823386-04154f 正文: 官网找到类似实例, 适当分 ...

  9. doT.js模板用法

    前提:引入doT.min.js: <script type="text/javascript" src="js/jquery.js"></sc ...

  10. MongoDB-基础知识学习(一)

    概述 最近mongodb在互联网的活跃度直线上升,并且我们公司也使用了mongoDB 3.6 作为生产重要的数据库,我们项目组要监控mongodb的op.log日志,在此整理以前学习的知识,为以后备份 ...