c语言中的连续输入问题

(这个是我写的,我觉得博文搬家有点麻烦,然后就复制粘贴过来了。)

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


  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值