1.具体问题(问题的解答还有待进一步的完善)
(1) 完整代码:
#include "stdio.h"
struct date
{
int month;
int year;
int day;
};
struct student
{
int num;
char name[16];
struct date birthday;
};
void main()
{
struct student student1;
printf("please input the data of the student\n");
printf("num \tname \n");
scanf("num is %d,name is %s",&student1.num,student1.name);
//getchar();
fflush(stdin);
printf("put into the birthday\n");
printf("the day \t the month \t the year\n");
scanf("%d%d%d",&(student1.birthday.day),&(student1.birthday.month),&(student1.birthday.year));
printf("the num is %d ,and the name is %s",student1.num,student1.name);
}
第二类代码:
仅标黄出发生变化
scanf(
"%d\t %s",&student1.num,student1.name);
//
fflush(stdin);
(2)问题描述
这只是代码部分,当我们运行程序后,如果我们在程序一中进行如下的输入
我们会看到,根本无法实现出生年月的输入。
2.错误分析
我们对这样的错误显示进行如下分析
首先,我们没有按照程序中规定的格式进行输入。
其次,在这段程序中有连个scanf输入,毫无疑问,第一个程序中输入的内容放到对应的变量中时,比然后残留一个enter。因为enter的存在使得第二个需要输入三个int的那段代码根本无法运行。
3,问题解决
如果,我们按照程序中规定的输入方法完成第一次的输入。在第二次进行scanf是不会有问题的。
而且此时的程序中并没有fflush(stdin);这就说明了一个问题,在源文件的编译过程中, scanf("num is %d,name is %s",&student1.num,student1.name)被标色的部分编译方式比较特殊。(特殊之处目前还不清楚)如果我们不能按照程序中指定的方式输入的话,我们可以在第二次scanf时添加fflush(),使用该函数后,虽然能实现第二次scanf的输入,但是第一次输入内容的赋值情况仍然是有问题的。
4. 总结
1)我们要保证运行时的输入和程序中指定的输入保持一致
2)缓存区中分配给程序输入的内容有限,如果多次输入,一定要记住使用fflush(stdin),释放相应的内存,一共下一次输入。尤其在以后出现多次字符串的输入时,这个问题将会更加明显。
参考内容
(scanf无法连用,主要是因为缓冲区不足,提交缓冲就好了。stdin 默认的缓冲区给了4k 加上一些系统的东西. 4k很快就不够用了。另一个原因是,第一scanf()接受一个字符输入,当你输入一个字符后按下回车,只有你输入的那个字符被赋给了a,而剩下的一个换行符还保留在缓冲中,当第二次输入时 无论你输入的什么字符,都是无效的,缓冲就如堆栈,符合先进先出原则,既然你缓冲中先前有个换行符,那么系统在遇见第二个scanf时自动会将换行符赋给 b,所以输入的东西都是无效的....所以 fflush 一下就可以解决此问题。
)
阅读(626) | 评论(0) | 转发(0) |