一、问题
运行以下代码:
#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();
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/73704.html