看似不必要的getchar()

项目场景:

谭浩强《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]);
	}
}

程序运行正常
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值