要理解为什么会出现'\n'被不同行的%c接受的问题,我们首先从输入缓冲区的问题入手
输入缓冲区是系统用来匹配CPU的高速和I/O设备的低速而降低CPU的中断频率所应用的缓冲模式
在 (3102 气球) 这一题中 http://47.106.114.75/problem/221
#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' 是因为字符型的换行符被整形输入略过了
#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
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
蒟蒻瑟瑟发抖,不对的地方望大佬指正