很多编程初学者在用scanf()函数的过程当中遇到不少的问题。比如:1:想要输入一个含有空格,tab键的字符串,该怎么办呢?2:当一不小心输入的数据与输入的格式不匹配,该如何从新输入呢?
1: 对于第一个问题,很多人想直接通过scanf("%s",str); (str是一字符指针); 你会发现空格或者tab键后面的字符串并没有输入到str中。这是因为scanf遇到空格就默认为一个数据输入的结束。为了解决这个问题,我们可以用%[]的格式输入。例如:
#include "stdio.h"
int main()
{
char ch[100];
scanf("%[^/n]",ch); //注意:/n前要有^符号
printf("%s/n",ch);
return 0;
}
输入:123 345 567↙
输出:123 345 567↙
2:当输入非法数据时,非法数据仍然存储在键盘缓冲区中,固然下面的输入也会受到了影响,这可能会导致整个程序瘫痪。比如
#include <stdio.h>
int main()
{
int a;
do
{
scanf("%d",&a);
printf("a=%d/n",a);
}while(a!=0);
}
本来是想通过输入0来结束程序。一不小心输入了一个非数字字符,这就导致了死循环。解决办法:我们可以根据scanf("%d",&a)的返回值来判断输入的数据是否与要求的格式一致,它的返回值为已匹配的数据的个数。如果返回值小于要输入的数据的个数,则表示这个输入错误。我们可以用fflush(stdin)把stdin输入流请空。例如:
#include <stdio.h>
int main()
{
int a;
int b;
do
{
if(scanf("%d,%d",&a,&b)==2) //输入的两个数据跟格式要求的一致
{
printf("a=%d,b=%d/n",a,b);
}
else //输入的输入不符合要求。
{
printf("a=%d,b=%d/n",a,b);
fflush(stdin);
}
}while(a!=0);
}
输入:1,2↙ 输出:a=1,b=2↙
3,d↙ a=3,b=2 ↙
0,s↙ a=0,b=2 ↙
3:键盘缓冲区残余信息问题
#include <stdio.h>
int main()
{
int a;
char ch;
do
{
scanf("%d",&a);
scanf("%c",&ch);
printf("a=%d c=%c/n",a,ch);
printf("c=%d/n",ch);
}while(ch!='0');
}
scanf("%c",&ch);并不能正常的接受输入字符,我们每次输入一个"Enter"键时,向键盘缓冲区发去一个“回车”(/r),一个“换行"(/n), /r被scanf()函数处理掉了,而/n被scanf()函数“错误”地赋给了c,解决办法:
再scanf()后面加上fflush(stdin);