关于C++scanf的一个小知识

博客 分享
0 318
张三
张三 2022-02-09 22:55:10
悬赏:0 积分 收藏

关于C++ scanf的一个小知识

关于C++的scanf,其实在使用时有一个注意的点。
我们来看一个简单的例子。

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

A 10 20B 30A 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);		}	}}
posted @ 2022-02-09 22:21 计算机知识杂谈 阅读(10) 评论(2) 编辑 收藏 举报
回帖
    张三

    张三 (王者 段位)

    821 积分 (2)粉丝 (41)源码

     

    温馨提示

    亦奇源码

    最新会员