c - scanf 的异常行为

标签 c scanf

我正在使用 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/

相关文章:

c - C中的可选输入

C公式无法得到正确的值

c - 使用 fscanf,将文件扫描到 C 中的结构中,但第一个参数已经失败

c# - 如何将 C dll 加载到 C# 代码中?

c - libclang : error: clang-c/Index. h: 没有那个文件或目录

c - 如果(fork())fork()

c - 安装C库但权限被拒绝?

C 语言实现的 cd 命令

c - 如何通过 Windows 批处理文件将值传递给 scanf()

c - 使用 fscanf 无法按预期读取文件