项目场景:
谭浩强《C程序设计》习题7.15,遇到的一个关于getchar( )用法的问题
问题描述:
以下是我自己写的输入数据函数的代码:
void input(int num[],char name[][8]){
int i;
for(i=0;i<2;i++){
printf("input NO.:");
scanf("%d",&num[i]);
printf("input name:");
gets(name[i]);
}
}
但是运行时就遇到如下问题
第一次输入后正常运行,但是执行到printf(“input name:”);时,还没等到第二次输入就打印出来了。
原因分析:
其实在第一次输入并按下回车的时候,控制台一共获得了两个字符,分别是:1、回车(enter)。但是因为scanf( )遇到非字符的时候会结束从控制台的获取,所以在输入1后,按下enter的同时,将1赋值给了类型为 int的 num [ i ],而将 ‘回车(enter)’ 保存在控制台输入的缓冲区,然后继续执行下一段输出代码,然后又要求用户输入。此时,因为上一次被使用过后的字符串被保存在缓冲区,现在gets从控制台的缓冲区获取上一次被使用过后的字符串,此时控制台缓冲区才算使用完了。所以在看似被跳过的输入,其实已经gets()已经获取了我们的输入了,这个输入就是一个回车(enter)。
解决方案:
使用getchar,清除掉缓存(回车enter)。
void input(int num[],char name[][8]){
int i;
for(i=0;i<2;i++){
printf("input NO.:");
scanf("%d",&num[i]);
printf("input name:");
getchar();
gets(name[i]);
}
}
程序运行正常