标签:int scanf 知识 C++ char 读入 printf 输入
关于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);
}
}
}
标签:int,scanf,知识,C++,char,读入,printf,输入 来源: https://www.cnblogs.com/jisuanjizhishizatan/p/15876819.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。