C语言的循环语句中使用 scanf(“%c“,&x); 输入字符时的问题

【示例代码】
下面代码,是在C语言的循环语句中使用 scanf("%c",&x); 输入字符,但输出的结果出乎意料。
原因详见问题分析。

#include <stdio.h>
#include <stdlib.h>

char ch;
int n;

int main() {
	while(n<5) {
		printf("Please enter a letter: ");
		scanf("%c",&ch);
		printf("%c\n",ch);
		
		n++;
	}

	return 0;
}


【问题分析】
本例代码执行后,会输出如下错误结果:即多了一条“Please enter a letter:”的提示。

Please enter a letter: M
M
Please enter a letter:

Please enter a letter:

原因在于,在C语言中,利用 scanf("%c",&x); 输入一个字符后的回车,会被作为字符存入缓冲区
因此,第一次调用 scanf("%c",&x); 输入一个字符后的回车,被作为字符存入缓冲区。当下一次调用 scanf("%c",&x); 时,会从缓冲区取出回车符作为输入,这就在输入逻辑上造成了混乱。所以,就输出了出乎意料的结果。

【解决方法及正确代码】
将scanf("%c",&ch); 改为 
scanf(" %c",&ch); 便可。即在%c前加一个空格。因为%c前面的空格,将清除缓冲区的内容。此外,getchar()函数也具有清除缓冲区的功能。所以,本例至少有两种解决方法。
方法一代码:

#include <stdio.h>
#include <stdlib.h>

char ch;
int n;

int main() {
	while(n<5) {
		printf("Please enter a letter: ");		
		scanf(" %c",&ch);    //clear buffer and enter a letter			
		printf("%c\n",ch);
		n++;
	}

	return 0;
}


方法二代码:

#include <stdio.h>
#include <stdlib.h>

char ch;
int n;

int main() {
	while(n<5) {
		printf("Please enter a letter: ");		
		scanf("%c",&ch);				
		printf("%c\n",ch);
		getchar();    //clear buffer
		n++;
	}

	return 0;
}




【参考文献】
https://blog.csdn.net/weixin_43260673/article/details/111460487
https://blog.csdn.net/qq_34316892/article/details/107459774

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值