现在,给大家说一说使用scanf()函数的一些值得注意的地方.不知大家有没有在编程的时侯,使用了scanf()函数后会出现一些异常情况.
大家有没有注意到要结束scanf()函数的输入一定要按回车键.是的,原因就是出现在这个地方.它的作用就是从输入流提取数据.
输入流的指针在stdio.h文件中有宏定义#define stdin (&_streams[0]) .也就是scanf()函数相当于:fscanf(stdin,...).
例如scanf("%d",&i); 相当于fscanf(stdin,"%d",&i); .所以,当输入流中有数据时,scanf()就从中提取数据,
不管你输入到输入流数据是什么.
比如下面例子:
#include<stdio.h>
#include<conio.h>
int main(void)
{
char string[10];
int i;
clrscr();
for(i=0;i<10;i++)
scanf("%c",&string);
printf("\n\n");
for(i=0;i<10;i++)
printf("%d\n",string);
getch();
return 0;
}
在运行时,输入到第5字符就输入结束.
结果:
1
2
3
4
5
49
10
50
10
51
10
52
10
53
10
从结果中,大家可以看出scanf()函数从输入流中提取'\n'字符.
也就是说,每当你输入完一个字符按一下回车符,这个输入的字符被scanf()提取了.但回车符还在输入流中,
当下一次scanf()函数时,因为输入流中有数据,就不从屏幕中等待输入了,就直接提取数据.这是scanf()函数提取的是:'\n'.
也就是出现了运行中,本来要输入10次字符,结果只输入了5次.
那么有什么解救的方法呢.我能想到的方法有二种:一种是每当scanf()函数执行后,把输入流中的'\n'提取出来以便下次scanf()
能正常提取.第二种方法是每当scanf()函数执行后,把输入流的数据清空(建议不要使用这种方法).
现在以第一种方法解决:
for(i=0;i<10;i++) for(i=0;i<10;i++) for(i=0;i<10;i++)
scanf("%c",&string); 改为====>>> { scanf("%c",&string); 或 { scanf("%c",&string);
getchar(); /*用来提取输入流的'\n'*/ scanf("%c",NULL); /*用来提取输入流的'\n'*/
} }
现在以第二种方法解决:
for(i=0;i<10;i++) for(i=0;i<10;i++)
scanf("%c",&string); 改为====>>> { scanf("%c",&string);
fflush(stdin); /*用来清空输入流*/
}
好了scanf()就说到这里吧.
应"静源"在本文章的提醒,就在此作一定的补充说明.
出现,scanf()接受回车留下的换行符的情况,只有在scanf("%c",&ch);情况下.
如果用scanf()来输入其它类型的数据,就不会发现上述情况.
在此,多谢"静源"的提醒.