问题的根源在于正在c和c++中空格和换行都是可以作为字符录入的,这就导致了当我们再录入字符时 ,按下回车或空格后,会发生将回车和空格也录入,导致输出出现错误。
例如:
#include <stdio.h>
int main(){
int x;
char a,b,c;
scanf ("%d",&x);
scanf ("%c %c %c",&a,&b,&c);
printf ("%d %c %c %c",x,a,b,c);
printf ("%d %d %c %c",x,a,b,c);
}
示例结果:
输入:
3
a b c
输出:
结果分析:
x正确保存了3,然而a保存了换行符’\n’(ascll码为10),b保存了a,c保存了b,录入的c被丢弃掉
解决这种问题方法:
1.getchar()消耗多余字符;
#include <stdio.h>
int main(){
int x;
char a,b,c;
scanf ("%d",&x);
getchar();
scanf ("%c %c %c",&a,&b,&c);
printf ("%d %c %c %c",x,a,b,c);
printf ("%d %d %c %c",x,a,b,c);
}
2:fflush(stdin)清空或刷新缓存区的所有数据:
fflush() 通常仅用于输出流。其目的是清除(或刷新)输出缓冲区并将缓冲的数据移动到控制台(如果是标准输出)或磁盘(如果是文件输出流)。下面是它的语法。
fflush(文件 *ostream);
ostream 指向输出流
或更新流,其中
最近一次操作未输入,
fflush 函数会导致任何
该流的未写入数据
传送到宿主环境
写入文件;否则,
该行为是未定义的。
#include <stdio.h>
#include<stdlib.h>
int main(){
int x;
char a,b,c;
scanf ("%d",&x);
fflush(stdin);
scanf ("%c %c %c",&a,&b,&c);
printf ("%d %c %c %c",x,a,b,c);
printf ("%d %d %c %c",x,a,b,c);
}
#include <stdio.h>
#include<stdlib.h>
int main()
{
char str[20];
int i;
for (i=0; i<2; i++)
{
scanf("%[^\n]s", str);
printf("%s\n", str);
fflush(stdin);
}
return 0;
}