马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
没有看懂这串代码,在第三次调用scanf函数的时候,我输入了2.5q加上好几个回车,按道理应该是不满足第二个do while的条件了,但是却一直没有结束循环,直到输入了2.5再按回车才结束
#include <stdio.h>
#include <stdlib.h>
int main()
{
float num = 0;
double sum = 0;
int status;
do
{
printf("请输入合法的数字:");
do
{
sum = sum + num;
status = scanf("%f", &num);
} while (getchar() != '\n' && status == 1);
} while (status == 1);
printf("结果是:%.2lf\n", sum);
system("pause");
return 0;
}
你好,这段代码的逻辑是:用户需要不断输入数字,这些数字将会被累加到 sum 中。程序会一直等待用户的输入,直到用户输入了非数字。
程序使用了 scanf 函数来获取用户的输入,并用一个浮点数来存储这个输入。 scanf 会返回成功读取的数据项数量,如果成功读取了一个浮点数, scanf 就会返回 1。
在内层的 do-while 循环中, getchar() != '\n' 和 status == 1 必须同时满足才能继续循环。 getchar() 函数会读取下一个可用的字符,如果这个字符不是换行符,并且 scanf 成功读取了一个浮点数,那么就继续循环。否则,退出循环。
然后在外层的 do-while 循环中,如果 status == 1 ,即 scanf 成功读取了一个浮点数,那么就继续循环,否则退出循环。
但是你的问题是在第三次调用 scanf 时输入了 "2.5q",这在 scanf 函数看来是一个不合法的输入,所以它只会读取 "2.5",并将 "q" 留在输入流中。此时, scanf 依然会返回 1,表示成功读取了一个浮点数。然后 getchar() 函数会读取 "q",因为 "q" 不等于换行符,所以内层的 do-while 循环会继续。这就造成了你的问题,即使你输入的不是一个合法的浮点数,程序也会继续运行,直到读取到一个合法的浮点数为止。
如果你想让程序在用户输入非数字时就立即退出,你需要修改你的程序,使其能够处理非数字的输入。有很多方法可以实现这个功能,比如使用 strtol 或 strtod 函数,它们能够报告非数字的位置。你还可以使用 fgets 函数来获取一整行的输入,然后使用 sscanf 或 strtol / strtod 来解析这个输入。
|