如果我有一个使用scanf来获取用户输入数据的程序:
scanf("%d",&val);
当我通过lint运行时,我收到警告,说scanf返回一个int,并且它没有被分配到任何地方。解决这个问题的实践是什么?我输入它是否为空?
(void)scanf("%d",&val);
答案 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()
可能会遇到很长的输入行问题,但有办法解决这个问题。)