当前位置 : 主页 > 编程语言 > c语言 >

scanf和getchar等输入语句共用输入缓冲区产生的问题,以及解决方法

来源:互联网 收集:自由互联 发布时间:2023-09-06
假设有如下代码 int main() {char password[20] = { 0 };scanf("%s", password);printf("你的密码将设置为%s,请确认\n", password);int i = 0;i = getchar();switch (i) {case 1:printf("已确认\n");break;case 0:printf("已删除\n

假设有如下代码

int main() {
	char password[20] = { 0 };
	scanf("%s", password);
	printf("你的密码将设置为%s,请确认\n", password);

	int i = 0;
	i = getchar();
	switch (i) {
	case 1:
		printf("已确认\n");
		break;
	case 0:
		printf("已删除\n");
		break;
	default:
		printf("请输入1或0\n");
		break;
	}

	return 0;
}

一、bug

当我们运行代码在scanf处输入123后,代码直接执行完毕,并没有等我们在getchar处输入,而是直接执行了switch里

的default。

scanf和getchar等输入语句共用输入缓冲区产生的问题,以及解决方法_bug

二、产生原因

在scanf处我们敲下了123和一个回车键,它们以“123\n”储存在输入缓冲区,scanf读走了123,缓冲区还剩一个\n,被getchar直接读取(\n的ASCLL码值为10,非0或1,所以会执行default)

三、解决方法

在scanf和getchar之间加一行代码

while ((getchar()) != '\n') {
		;
	}

一直执行getchar直至把输入缓冲区的内容取完


为什么不能只用一次getchar把\n取走就好,而要用while语句一直取,直到把\n取走?

因为有一些情况:当密码输入123 456时,scanf只读取123,后面的“空格”+“456”+“\n”一次取不完,需要用while+getchar取干净。


【文章原创作者:盐城网页开发 http://www.1234xp.com/yancheng.html 网络转载请说明出处】
上一篇:计算二叉树结点总数
下一篇:没有了
网友评论