Chinaunix首页 | 论坛 | 博客
  • 博客访问: 6324
  • 博文数量: 2
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 42
  • 用 户 组: 普通用户
  • 注册时间: 2013-10-13 07:15
文章分类

全部博文(2)

文章存档

2013年(2)

分类: C/C++

2013-11-27 22:07:05

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 一下就可以解决此问题。




阅读(1007) | 评论(0) | 转发(1) |
0

上一篇:数据结构--绪论

下一篇:没有了

给主人留下些什么吧!~~