我正在使用 GCC 编译器。在我的程序中,我使用了 3 个 scanf,但在执行时只执行 2 个 scanf。为什么它会跳过 1 scanf
?它只是执行 else 条件。
#include <stdio.h>
int main()
{
int h, c, t;
printf("tensile");
scanf("%d", &h);
printf("tensile1");
scanf("%d", &c);
printf("tensile2");
scanf("%d", &t);
if( h > 50 && c > 0.7 && t > 5600)
printf("HI");
else
printf("bye");
return 0;
}
最佳答案
您将 c
定义为 int
并将其与 0.7
进行比较。即使忽略任何 scanf
问题,这也没有多大意义。决定每个变量是只包含整数还是(可能是小数)实数。对于整数,您可能需要 int
。对于实数,您可能需要double
。然后您需要根据变量的类型为 scanf
使用正确的格式。有关详细信息,请阅读 scanf
文档。
使用 "%d"
格式,scanf
将读取单个整数(在跳过任何空格,包括换行符之后),然后停止。如果输入是“12.34”
,它将读取“12”
,将12
存储在变量中,并保留“输入流中的 .34"
。稍后使用 "%d"
调用 scanf
将在看到 '.'
字符时失败。使用其中一种浮点格式读取 double
类型的变量并允许诸如 "12.34"
之类的输入。
scanf
返回一个结果,指示成功读取的项目数量,或返回错误指示。您应该测试该结果,以便您的程序能够检测到错误,而不是盲目地继续使用错误数据运行。
准确地向我们展示(即复制和粘贴)您为程序提供的输入将使我们更容易回答您的问题。
打印变量的值和 scanf
返回的结果将有助于您了解正在发生的情况 - 或者您可以检查调试器中的值(如果有)可用。
需要注意的一些事情:scanf
将报告输入语法错误的失败(例如,如果它正在查找实数并且您输入 "foobar"
),但它不一定能诊断出溢出。如果您输入 1.0e99999999
作为浮点输入,则行为未定义。避免该问题的唯一真正方法是避免使用 scanf
进行数字输入。 (恕我直言,这是 C 标准定义 *scanf
函数的方式中的一个缺陷。)
浮点比较是出了名的不可靠。如果 c
是浮点变量,则 c > 0.7
可能为 true 或 false,因为值 0.7
无法用二进制精确表示 float 。
关于c - scanf 的异常行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14550888/