C语言getch(),getchar()和gets()和缓冲区溢出

这段时间在学习C语言,写了下面这样一段代码

struct student
{
   char name[50];
   char number[12];
   struct student *next;
};

int main()
{
   struct student * head,*p,*temp;
   head=(struct student *)malloc(sizeof(struct student));

   if(head==NULL)
   {
      printf("分配内存失败!");
      exit(0);
   }
   else
   {
      head->next=NULL;
      p=head;
      int iCount=0;
      printf("请输入学生个数:");
      scanf("%d",&iCount);
      int i;
      for(i=0;i<iCount;i++)
      {
        temp=(struct student *)malloc(sizeof(struct student));
 if(temp==NULL)
 {
      printf("分配内存失败!");
      exit(0);
 } 
 else
 {
    printf("请输入第%d个学生的姓名:",i+1);
    gets(temp->name);
    printf("请输入第%d个学生的学号:",i+1);
    gets(temp->number);
    temp->next=NULL;
    p->next=temp;
           p=p->next;
 }
      }
      temp=head->next;
      i=1;
      while(temp!=NULL)
      {
 printf("第%d个学生的姓名是:%s,学号是:%s\n",i++,temp->name,temp->number);
    temp=temp->next;
      }
   }
   system("pause");
   return 0;
}

 就是一个录入n个学生的信息的过程,满心欢喜的运行,结果却让我很蛋疼,就是在运行过程中第一次输入学生姓名的步骤总是被跳过了,

百思不得其解,上网查了一下,结果是因为在输入学生个数的时候,敲的换行符留在了输入缓冲区里面,而gets函数正是从缓冲区里面读取数据,并且是读到换行符作为本次输入的结束,所以第一次运行到gets函数的时候直接从输入缓冲区里面读入了换行符,本次输入结束,为了避免这种情况,可以在循环之前清空输入缓冲区,可以使用getchar函数,getchar函数同gets函数类似,也是从输入缓冲区中读取数据,这样相当于getchar把缓冲区中的换行符取走了,也就是清空了输入缓冲区,也可以使用fflush(stdin); 作用相同,也是清空输入缓冲区,这里不能使用getch函数,getch函数并不直接从缓冲区中读取数据,而是等待用户键盘输入,直到用户敲击键盘为止,而换行符依旧留在缓冲区中。

其实说getchar函数清空缓冲区是不对的,应该是从缓冲区中取走一个字符,恰好刚才的情况输入缓冲区中只有一个字符。

这里面还有一个问题,就是gets函数是不进行溢出检查的,当我将name和number两个字符数组的长度都设置为2后,发生了不可预知的情况,

 

输出字符串都超出了字符数组的长度,查看了一下name和number的地址,分别是4074544和4074546,也就是说在输入姓名的时候顺便把学号的内存也给写了,而输入学号的时候将多余的字符写到了相邻的内存里面。

怪不得人说gets函数只适用于玩具程序,呵呵。

 

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值