while里面scanf()被忽略的解决办法

导读:本篇文章讲解 while里面scanf()被忽略的解决办法,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

一、问题
运行以下代码:

#include<stdio.h>
#include<stdlib.h>
int main()
{
	int a, b;
	char c=NULL;
	while (c!='n')
	{
		printf("请输入a的值:");
		scanf_s("%d", &a);
		switch (a)
		{
		case 1:printf("%d", a * a); break;
		case 2:printf("%d", a * a); break;
		case 3:printf("%d", a * a); break;
		case 4:printf("%d", a * a); break;
		default:printf("error\n"); break;
		}
		scanf_s("%c", &c);  //重新输入变量c的值,若输入y则循环继续,否则while循环break
		if (c != 'y')
		{
			printf("you choose break");
			break;
		}
		else
			printf("you choose continue");
		system("cls");   //清屏
	}
	return 0;
}

输出结果:
在这里插入图片描述
在输入12之后,代码直接运行至结束。对于while里的第二个scanf_s(),直接忽略了。
二、调试过程:找出问题
1、查看第二个scanf_s()有没有执行
思路: 查看变量c的值是否改变来判定scanf_s()是否执行
方法:
(1)输出c的值:在第二个scanf_s()后加以下语句

printf("%c", c);

结果:
在这里插入图片描述
和前面的结果相比,可以看出中间多空了一行,那么添加该语句作用类似于:

printf("\n");

那么就可以猜测c='\n'
验证c的值:输出c的ascll值,添加以下语句

printf("%c", c);
printf("%d", c);

结果:
在这里插入图片描述
printf("%d", c)输出的值为10,即c的ascll值=10,查表可得c='\n'
(2) 调试过程中查看c的值
步骤1:设置断点。在scanf_s()语句出设置断点。由下图,可以看到在该语句执行前:c=0(’\0’)(即c=NULL)
在这里插入图片描述
步骤2:逐步调试。点击下面这个方框中的箭头,执行scanf_s()语句。
在这里插入图片描述

可以得到以下结果:c=’\n’。
在这里插入图片描述
2、执行scanf_s(),为什么c=’\n’。
在第一次我们输入a的值后,我们又按下enter键(即换行“\n”)。所以12\n都作为是scanf_s()的输入存放在缓冲区,第一个scanf_s()提取了12,则第二个自动提取\n作为输入。

三、解决方法
思路:在第二个scanf_s()之前,将\n提取出输入缓冲区。
在第二个scanf_s()之前,添加以下语句:

getchar();

输出结果:可以对第二个scanf_s()进行输入。
在这里插入图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/73704.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!