我有这个问题,gcc使用Werror参数,出现错误'忽略scanf'的返回值。现在,我检查了论坛,我确实做了一些事情,比如将它放在if语句中似乎工作正常,但问题是,如果我在我的大学编译它,我不会得到错误。
#include <stdio.h>
#include <stdlib.h>
#define EXAMPLE1 5
int main (int argc, char* argv[]) {
int example;
scanf ("%d", &example);
if (example <= EXAMPLE1) {
printf ("Woohoo\n");
} else {
printf ("Oohoow\n");
}
return EXIT_SUCCESS;
}
所以这个代码例如可以在我的uni上使用gcc -Wall -Werror -O -o namehere namehere.c进行编译,但如果我在家中使用它,则会出现上述错误。我的大学正在使用gcc 4.9.2。我在家里尝试了gcc 4.8.4,4.8.5,4.9.3。
答案 0 :(得分:1)
忽略scanf()
的返回值并不好,因为这意味着您没有检查输入中是否存在可能的错误。虽然有些编译器或设置没有给出警告,但您不应忽略scanf()
的返回值。
试试这个:
#include <stdio.h>
#include <stdlib.h>
#define EXAMPLE1 5
int main (int argc, char* argv[]) {
int example;
if (scanf ("%d", &example) != 1) {
printf ("Read error\n");
}
else if (example <= EXAMPLE1) {
printf ("Woohoo\n");
} else {
printf ("Oohoow\n");
}
return 0;
}
答案 1 :(得分:0)
你没有收到错误,编译器非常友好地给你一个警告。并且正确!错误输入example
将具有随机值。
始终检查scanf
的返回值是否与您要读取的参数数量相匹配。
答案 2 :(得分:0)
scanf ("%d", &example);
这告诉scanf
读取一个十进制数字字符序列(可能带有前缀的负号)直到第一个非十进制字符,并将该序列转换为存储的int
值进入example
。
如果用户输入的内容完全是非小数,或者stdin
已关闭,该怎么办? scanf
调用会失败,使用相应的返回值表示失败......但example
的值在这种情况下是什么?
您需要检查返回值,以避免在包含垃圾时使用example
。如果您尝试使用该变量,程序的行为可能会不稳定。这可能包括段错误。
您的编译器有权拒绝编译此代码,因为使用未初始化(或其他不确定)变量是未定义的行为。
总之,始终检查返回值符合您的最佳利益,因为: