【发布时间】:2021-04-08 04:10:45
【问题描述】:
我基本上通过解决问题解决了我的问题,但我只是想了解为什么会发生这种行为,所以首先我的代码:
#include <stdio.h>
#pragma warning(disable : 4996) // Just so MVS stops having a meltdown over scanf.
/* Simple question and answer of math equasion. */
int main()
{
printf("What is 5 + 5?\n\nAnswer: ");
int userInput;
if (scanf("%i", &userInput) && userInput != (5 + 5)) // Give 'userInput' a variable from scanf and compare to hard coded answer.
{
printf("\nIncorrect!\n");
return 0;
}
printf("\nCorrect!\n"); // Else without the 'else'.
return 1;
}
这很简单,是硬编码的数学问题,需要用户回答。对于匹配userInput 的答案,预期响应是正确的,任何不匹配的都被认为是不正确的。当我传递一堆字母或只是简单地传递“asdf”时,它会将其视为正确并吐出一个负数:-858993460。
我的解决方法是将|| userInput < 0 添加到我的 if 语句中,如下所示:
if (scanf("%i", &userInput) && userInput != (5 + 5) || userInput < 0)
所以基本上这个问题已经用一些 flextape 处理了,但我似乎无法回答的问题是:“为什么不管我输入什么字母或非数字字符,它都会吐出负数?”
如果这个问题已经得到解答,我深表歉意。我尝试使用我能想到的任何关键字进行搜索。
【问题讨论】:
-
“吐出负数”是什么意思?显示的代码中没有任何内容可以打印数字。无论如何,核心问题是代码并不完全正确。如果输入了无效输入,
scanf将返回EOF。在这种情况下,您的原始代码仍将其视为正确的情况。检查应该是scanf() == 1。 -
如果我在输入字母时在正确的下方添加
printf("i%", userInput);,这就是它给我所说的负数的地方。抱歉,我应该将其添加到代码中。 -
那是因为
scanf失败并且没有为userInput设置任何值。由于userInput没有初始化,在这种情况下它只会包含垃圾数据。除非scanf成功,否则不得使用userInput。 -
不,如果
scanf失败,它根本不会触及userInput。这只是变量中碰巧出现的任何随机垃圾。访问未初始化的变量是未定义的行为,因此该值是不可预测的并且没有意义。 -
另外,您几乎肯定不想将
scanf与%i一起使用,或许应该使用%d。%i将接受八进制数字,因此如果您输入 012,那也是正确的,因为 012 Dec 是 010 Dec.
标签: c string math integer scanf