我正在试验和训练一些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
数字8
和7
是我输入的随机数。
为什么0
?它应该是56
。
答案 0 :(得分:1)
即使在从命令行读入num1和num2之前,您也在计算num3。假设,num1和num2被初始化为零,num3在计算时将为零。
答案 1 :(得分:1)
菲利普,你必须把马放在购物车前。在将它们相乘之前,必须使用值初始化变量。 (事实上,尝试访问未初始化变量中的值会调用未定义行为(这很糟糕......)
您希望在以下代码中发生什么?
int num1, num2;
int num3 = num1 * num2;
num1
,num2
中包含哪些值?您认为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 scanf
和num1
成功放置值后,才能有效地将num2
和num1
相乘,例如
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;