忽略scanf的返回值

时间:2016-03-17 10:54:10

标签: c gcc

我有这个问题,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。

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。如果您尝试使用该变量,程序的行为可能会不稳定。这可能包括段错误。

您的编译器有权拒绝编译此代码,因为使用未初始化(或其他不确定)变量是未定义的行为。

总之,始终检查返回值符合您的最佳利益,因为:

  • 有些编译器可能拒绝编译没有进行此类检查的代码,因为您已经注意到了。
  • 那些编译代码的程序将允许程序运行不正常,当用户输入垃圾时使用垃圾,或者在某些情况下,由于使用了陷阱表示,可能会出现segfaulting。