在C中使用scanf返回void而不是int

时间:2011-09-12 18:50:29

标签: c

如果我有一个使用scanf来获取用户输入数据的程序:

    scanf("%d",&val);

当我通过lint运行时,我收到警告,说scanf返回一个int,并且它没有被分配到任何地方。解决这个问题的实践是什么?我输入它是否为空?

    (void)scanf("%d",&val);

8 个答案:

答案 0 :(得分:4)

解决此警告的C最佳做法很简单:检查结果代码。如果操作已经正常,则scanf函数在int中返回,并且通常将错误存储在errno中。

缺少结果代码检查通常会在某些情况下导致严重错误。

答案 1 :(得分:2)

当然,正确的答案是不要忽略返回值。对于一个健壮的程序,你应该总是(编辑:通常)检查返回值是否表示成功,如果没有则优先失败。

答案 2 :(得分:0)

理想情况下,你会做类似

的事情
int scanVal = scanf("%d", &val);
if (scanVal != 1) {
  // wait a minute, scanf couldn't match input to a "%d"!
}

然后以明智的方式对输出采取行动。

答案 3 :(得分:0)

不要沉默lint消息,只需检查返回值以确保没有出错。从手册页:

  

返回值

     

这些函数返回输入项的数量   成功匹配和分配,可以   少于提供,甚至在早期的情况下为零   匹配失败。

     

如果之前达到输入结束,则返回值EOF   要么是第一次成功转换,要么是匹配失败。如果发生读取错误,则还返回EOF,在这种情况下,   设置了流的错误指示符(请参阅ferror(3))   设置errno表示错误。

答案 4 :(得分:0)

scanf返回成功匹配和分配的输入项数。将其返回值与您期望的数字进行比较,以便检测错误。

while (scanf("%d",&val) != 1)
    printf("Try again.\n");

答案 5 :(得分:0)

使用

#pragma warning(disable:<warning number>)
scanf("%d",&val);
#pragma warning(default:<warning number>)

您的编译器将禁止该警告。

答案 6 :(得分:0)

最佳做法是指定scanf的返回值,以查看是否读取了所有(或多少)项。在这种特殊情况下,如果它返回除1之外的任何内容,则出现问题(例如,您想要一个数字,但用户正在给您不可打印的字符),您应该适当地处理它。

答案 7 :(得分:0)

如果您希望代码在输入错误时保持健壮,请不要使用scanf("%d", ...)

对于大多数错误,scanf("%d", &val)将返回0以指示它无法读取int值(例如,如果输入是“foo”而不是“123”)。

但是如果输入在语法上有效但超出范围(例如9999999999999999999),则行为未定义

大多数实现都可能表现得很好,但我不知道它有多大的一致性。

要安全地读取int值,请使用fgets() not gets()),然后使用strtol()。 (fgets()可能会遇到很长的输入行问题,但有办法解决这个问题。)