C语言错误:忽略了scanf的返回值?

13

我才学习C语言几天,所以不太确定这段代码有什么问题:

#include <stdio.h>

int main(int argc, char * argv[]) {
    int sides;
    printf("Please enter length of three sides :\n");
    scanf("%d", &sides);
    return 0;
}

我收到的错误信息如下:

 

忽略scanf的返回值

我在这里做错了什么,我该怎么办才能解决这个问题?


你打算做什么?在这段代码中,你根本没有使用 scanf 的返回值!你打算如何处理它? - vsz
尽管忽略 scanf 的返回值并不是严格的错误,而且你的编译器只是在提供更多的帮助,但你应该真正考虑忽略任何I/O操作的返回值是一个编程(或至少是思维)错误。所有的I/O都有可能失败,一个没有处理这种情况的程序本质上是不正确的。 - Kerrek SB
可能是在C语言中忽略返回值的重复问题。 - Ciro Santilli OurBigBook.com
5个回答

10

你可能会编写代码

if (scanf("%d", &sides) >0) {
    printf("you want %d sides.\n", sides);
} 
else printf("You did not enter any number.\n");

scanf函数有几个作用:

  1. 它期望输入一些内容,并可能通过引用传递的变量来修改它们。
  2. 它返回成功输入项的数量。

使用if语句是可行的,我以前已经做过了,但我在大学电脑上没有遇到需要if语句的情况...所以也许是我家里电脑上的某些设置?此外,非常感谢您提供的链接-它应该很方便。 - Cnerb
好的,我通过调用 int sides = scanf("%d", &sides) 让它工作了。谢谢。 - Cnerb
1
不,编写 sides = scanf("%d", &sides); 是错误的。你不应该像这样两次使用相同的 sides 变量。 - Basile Starynkevitch

7

这是一个警告,阻止编译器执行其任务(设置过于严格)。检查scanf()函数的返回值是否存在错误,警告应该会消失。

返回值

成功时,该函数返回成功读取的项数。此计数可以与预期的读取数量匹配或更少,甚至为零,如果发生匹配失败。在任何数据成功读取之前发生输入故障的情况下,将返回EOF。


顺便提醒一下,我在大学的电脑上没有这个问题。 - Cnerb
有几个严格程度的级别,其中一个将警告视为错误。我猜你所说的“错误”是指这种情况。 - Alexander
抱歉没有具体说明,这是一个被视为错误的警告。 - Cnerb
如果您告诉我们您使用的IDE/编译器,我们可以为您提供如何关闭它的信息。 - Alexander
我使用gedit编写程序,并在Ubuntu上使用标准的xterm进行编译/运行。 - Cnerb
正如@Thiruvalluvar所指出的那样,这是“-Werror”标志。如果您想继续使用它,您必须检查函数的返回值。 - Alexander

1

scanf 返回“项”的数量,即在格式字符串中传递的值(例如,单个项目是 %d%c 等等),以及后续传递给 scanf 的参数。例如,要读取由逗号和空格分隔的两个整数,您可以使用:

int x, y;
int items = scanf("%d, %d", &x, &y);
assert(items == 2);

我在上面已经透露了我的建议 - 如果你只是想读取它,而不是添加未使用的变量,那么可以添加一个断言:

#include <assert.h>
/* ... */
assert(scanf("%d", &sides) > 0);
/* ... */

很遗憾,assert(scanf("%d", &sides)); 不够安全,因为 EOF 会返回 -1。这样做将非常优雅。

我认为,如果您不想在此情况下使用未初始化的变量 (sides) 继续进行程序,则应采用这种方式。

或者,您可以将 scanf 的结果捕获到一个变量中,并像其他答案中那样优雅地处理它。


0
你没有将scanf的返回值赋给一个变量。它是一个整数计数,表示读取了多少个字符。如果这对你很重要,那么最好将其保存。

4
相信我,这对你很重要。但这是成功扫描的项目数量的计数,而不是字符数量。 - paxdiablo
即使像 int count = scanf("%d", &sides); 这样无害的语句也足以消除警告。虽然我必须承认,在gcc 4.6上,我没有收到相同的警告。 - Makoto

0
scanf()函数返回一个整数值;如果你不打算使用它,你可以在你的scanf语句的开头简单地添加(void),像这样:
    (void)scanf("%d", &sides);

这应该解决你的问题。

虽然这是一个有效的答案,但你可能会发现在Stack Overflow上,你的建议并不受欢迎。有很多答案和评论强调忽略返回值通常不是一个好主意。 - undefined
提问者问道:“我在这里做错了什么,我该怎么修复它?”他们的代码表明他们正在尝试读取一个整数。除非他们检查scanf()调用的返回值,否则他们不知道是否成功。这是他们做错的事情。你的答案虽然允许编译完成,但没有解决这个问题。所以我不认为它是一个有帮助的答案。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接