scanf格式串过滤‘\n’的问题

要理解为什么会出现'\n'被不同行的%c接受的问题,我们首先从输入缓冲区的问题入手

 输入缓冲区是系统用来匹配CPU的高速和I/O设备的低速而降低CPU的中断频率所应用的缓冲模式

在 (3102 气球) 这一题中 http://47.106.114.75/problem/221

放WA的代码

#include//221
#include
int main()
{
	int n,i;
	int a,b;
	char c;
	double x;
	scanf("%d",&n);
	for(i=0;i

我们在每次输入三个数据的时候键盘(标准输入设备)是接受的 %c %d %d\n 这样的形式

 而代码scanf("%c %d %d",&a,&b,&c) 接受时 当scanf读到%d之后就不再匹配后面的'\n'

而剩下的 '\n' 则留到了输入缓冲区的位置,这种即是行缓冲,也就是在这种情况下,当在输入和输出中遇到 换行符 时,执行真正的I/O操作。这时,我们输入的字符先存放在缓冲区,等 按下回车键换行 时才进行实际的I/O操作。典型代表是 标准输入(stdin) 和 标准输出(stdout) 。

所以在下一行输入的时候%c就会接收到任然处于缓冲区的'\n'

而在 207 四则运算中 http://47.106.114.75/problem/view?id=207

我们每次输入时(标准输入设备)接受的是 %d %d %c 这样的形式

但是在下一行时我们不需要接受 '\n' 是因为字符型的换行符被整形输入略过了

放AC代码

#include
#include
#include
#include
#include
#include
#include
#define res register int
#define dd double
#define ll long long
using namespace std;
const int maxn=1e3+12;
int main(){
    int a,b;char c;
    while(scanf("%d %d %c",&a,&b,&c)&&a+b){
	if(c=='+') printf("%d + %d = %d\n",a,b,a+b);
	else if(c=='-') printf("%d - %d = %d\n",a,b,a-b);
	else if(c=='*') printf("%d * %d = %d\n",a,b,a*b);
	else if(c=='/'){
	    if(a%b==0) printf("%d / %d = %d\n",a,b,a/b);
       	    else{
		double as=a,bs=b;
		double ans=(double)(as/bs);
		printf("%d / %d = %.2f\n",a,b,ans);
		}
	    }
	else if(c=='%'){
	    printf("%d %% %d = %d\n",a,b,a%b);
	}
    } 
	return 0;
}

而在3102题中使用scanf("%c%d%d\n”) / getchar(); / fflush(stdin) 来都不能AC的原因应该是非交互题使用fflush(stdin)不能对缓冲区进行清空,而前两种方法行不通的原因应该是nenu-oj的问题或者数据的问题 (因为使用getchar()同样的代码在HDU上AC)

  • 放图

1.使用getchar();

     代码:

#include//221
#include
int main()
{
	int n,i;
	int a,b;
	char c;
	double x;
	scanf("%d",&n);
	for(i=0;i
  • NENU_OJ

scanf格式串过滤‘\n’的问题_第1张图片

  •  HDU

2.使用scanf("%d\n")

#include//221
#include
int main()
{
	int n,i;
	int a,b;
	char c;
	double x;
	scanf("%d\n",&n);
	for(i=0;i

 

 所以我们发现scanf("%d\n")的方法也可以将'\n'接收

现在我们来讨论可行(nice)的方法:scanf(" %c") 即在%c前面加空格

scanf格式串用法之一时可用" "(space) 接受所有的空白字符(缩进符,换行符,空格等等),即我们在前面加了空格之后就可用空格来接受上一行进入缓冲区的'\n',所以这种在%c前面加空格是最有效的接收换行符的方法Orz

蒟蒻瑟瑟发抖,不对的地方望大佬指正

你可能感兴趣的:(scanf格式串过滤‘\n’的问题)