C错误,简单的scanf函数,整数给出0作为结果

时间:2017-09-28 22:49:08

标签: c integer printf scanf

我正在试验和训练一些C,我发现了一个我无法理解的非常奇怪的“错误”。

我的代码是:

#include <stdio.h>

int main() {

    int num1, num2;
    int num3 = num1 * num2;

    printf("Enter a number: ");
    scanf("%d", &num1);
    printf("Enter one more number: ");
    scanf("%d", &num2);
    printf("The result of %d * %d is %d\n", num1, num2, num3);
}

我希望它假设变量num3是num1和num2之间的乘积。

我得到了这个输出:

Enter a number: 8
Enter one more number: 7
The result of 8 x 7 is 0

数字87是我输入的随机数。

为什么0?它应该是56

3 个答案:

答案 0 :(得分:1)

即使在从命令行读入num1和num2之前,您也在计算num3。假设,num1和num2被初始化为零,num3在计算时将为零。

答案 1 :(得分:1)

菲利普,你必须把马放在购物车前。在将它们相乘之前,必须使用值初始化变量。 (事实上​​,尝试访问未初始化变量中的值会调用未定义行为(这很糟糕......)

您希望在以下代码中发生什么?

int num1, num2;
int num3 = num1 * num2;

num1num2中包含哪些值?您认为num3会得到什么?在这样的情况下,看到How to debug small programs并与鸭子交谈真的是一个好主意......真的,它有助于:)

接下来是未经验证的用户输入,例如

scanf ("%d", &num1);

如果用户输入"one"(或键盘上的猫步),会发生什么?始终,始终验证用户输入。 scanf 返回 成功转化的次数。在"%d"的情况下 - 如果命令成功将整数值放在1中,则为num1。一个简单的测试可以节省很多麻烦,例如。

    printf ("Enter a number: ");
    if (scanf ("%d", &num1) != 1) { /* validate ALL user input */
        fprintf (stderr, "error: invalid input or user canceled.\n");
        return 1;
    }

通过检查scanf的返回值是1,您可以防止匹配输入失败(请参阅:{{1} })。

只有在man scanfnum1成功放置值后,才能有效地将num2num1相乘,例如

num2

将所有部分放在一起,马在购物车之前,并注意 num3 = num1 * num2; /* num1 & num2 must have values first */ main()类型,因此int值为 [1] ,你可以做类似以下的事情:

return

示例使用/输出

#include <stdio.h>

int main (void) {

    int num1, num2, num3;

    printf ("Enter a number: ");
    if (scanf ("%d", &num1) != 1) { /* validate ALL user input */
        fprintf (stderr, "error: invalid input or user canceled.\n");
        return 1;
    }

    printf ("Enter one more number: ");
    if (scanf ("%d", &num2) != 1) { /* Ditto */
        fprintf (stderr, "error: invalid input or user canceled.\n");
        return 1;
    }

    num3 = num1 * num2; /* num1 & num2 must have values first */

    printf ("The result of %d * %d is %d\n", num1, num2, num3);

    return 0;   /* main() is type int and returns a value. */
}

仔细看看,如果您有其他问题,请告诉我。

脚注[1] 请参阅:C11 Standard §5.1.2.2.1 Program startup (draft n1570)。另见:See What should main() return in C and C++?

答案 2 :(得分:0)

您还可以将num3添加到第一个init,然后在提示用户输入数字后输入行num3 = num1 * num2;