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

一、问题
运行以下代码:

#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()进行输入。
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

树下等苹果

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值