c++第二遍scanf读入问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c++第二遍scanf读入问题相关的知识,希望对你有一定的参考价值。

我们acm上机练习要求用scanf输入,我是菜鸟啊。cin的输入会测试超时;
题目要求就是一个9位字符串。每三位作为一个三位数,要求前两个相加等于第三个,如果是输出YES,否则NO。
例如输入100100200,100+100=200,所以输出YES。
我用cin的话不会错,可是scanf第一遍结果正确,可是第二遍输入就会错误,我是菜鸟实在不懂不懂,求教。以下是我写的代码,我很努力了!
顺便我想了解一下这是为啥,第二遍读入时我之前测试了下各个char数据,char的读入都不对了,求助。

#include<iostream>
#include<cstdio>
int main()

char a[3],b[3],c[3];
int x,y;
while(scanf("%c",&a[0]))

scanf("%c",&a[1]);
scanf("%c",&a[2]);
scanf("%c",&b[0]);
scanf("%c",&b[1]);
scanf("%c",&b[2]);
scanf("%c",&c[0]);
scanf("%c",&c[1]);
scanf("%c",&c[2]);
x=100*(a[0]+b[0])+10*(a[1]+b[1])+1*(a[2]+b[2])-'0'*222;
y=100*c[0]+10*c[1]+1*c[2]-'0'*111;
if(x==y) printf("YES\n");
else printf("NO\n");
printf("%d %d\n",x,y);
a[0]='0';

return 0;

鄙人猜测可能是换行符的问题
你第一次输入结束时 肯定按了回车 这就缓存了个换行符 下次输入的时候直接把换行符给了a[0]

while(scanf("%c",&a[0]))

scanf("%c",&a[1]);
scanf("%c",&a[2]);
scanf("%c",&b[0]);
scanf("%c",&b[1]);
scanf("%c",&b[2]);
scanf("%c",&c[0]);
scanf("%c",&c[1]);
scanf("%c",&c[2]);
getchar();

添一个getchar() 取出换行符应该就米事鸟
参考技术A int a,b,c;
scanf("%3d%3d%3d",&a,&b,&c);
if (c == a+b) printf("Yes"); else printf("No");

(printf 也可 cout )。
参考技术B 确实加了getchar();就没事了
#include<iostream>
#include<cstdio>
int main()

char a[3],b[3],c[3];
int x,y;
while(scanf("%c",&a[0]))

scanf("%c",&a[1]);
scanf("%c",&a[2]);
scanf("%c",&b[0]);
scanf("%c",&b[1]);
scanf("%c",&b[2]);
scanf("%c",&c[0]);
scanf("%c",&c[1]);
scanf("%c",&c[2]);
getchar();
x=100*(a[0]+b[0])+10*(a[1]+b[1])+1*(a[2]+b[2])-'0'*222;
y=100*c[0]+10*c[1]+1*c[2]-'0'*111;
if(x==y) printf("YES\n");
else printf("NO\n");
printf("%d %d\n",x,y);
a[0]='0';

return 0;

读入优化与输出优化

C++是一门神奇的学科。。。

在读入/输出时,我们经常用到:

scanf , cin , printf , cout

但是,在算法竞赛中,我们奉行一个原则:

效率第一!

于是,便产生了各种各样的奇技淫巧。。。

下面的读入与输出优化就是其中之一。

读入优化:

C++自带的 scanf 已经很快了,但是100W的数据要0.6~0.8s,很明显,还是慢了。

为什么?因为 scanf 带了许多厉害但是我们不需要的的特判。

于是,读入优化破壳而出:

inline int read(){
	int date=0,w=1;char c=0;
	while(c<‘0‘||c>‘9‘){if(c==‘-‘)w=-1;c=getchar();}
	while(c>=‘0‘&&c<=‘9‘){date=date*10+c-‘0‘;c=getchar();}
	return date*w;
}

调用时,只需要:

int x;
x=read();

即可。

效率超级高!

输出优化:

有读入优化,就有输出优化:

inline void write(int x){
	if(x<0){putchar(‘-‘);x=-x;}
	if(x>9)write(x/10);
	putchar(x%10+‘0‘);
}

调用时,只要:

int x=10;
write(x);

即可。

时间大幅降低!

总结:

C++中还有各种各样的奇技淫巧,比如什么:

inline , register

等。

好好利用它们,可以卡掉那些TLE的点,甚至逆转AC!

以上是关于c++第二遍scanf读入问题的主要内容,如果未能解决你的问题,请参考以下文章

读入优化与输出优化

C++ 输入输出知识点(持续更新)

C++ 输入输出知识点(持续更新)

为啥不能用scanf读入一个含有空格的字符串

C++中数字与字符串之间的转换 scanf string总结(复习必读)

加快cin的读入速度