【问题标题】:C - error: ignoring return value of scanf?C - 错误:忽略scanf的返回值?
【发布时间】:2012-04-06 13:01:59
【问题描述】:

我才刚接触 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 的返回值!你打算用它做什么?
  • 虽然忽略scanf 的返回值并不是严格意义上的错误,而且您的编译器只是做了您可能期望的更多处理,但您真的应该考虑忽略任何 I/O 操作的返回值是一种编程(或至少是一种思考)错误。所有 I/O 都可能失败,不处理该问题的程序本质上是不正确的。

标签: c


【解决方案1】:

你可以编码

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 语句是可行的,我以前做过,但我没有遇到在 uni 计算机上需要 if 语句的情况......所以也许它在我的家用计算机上进行了一些设置?也谢谢你的链接 - 它应该很方便
  • 好的,我把它叫做 int side = scanf("%d", &sides)。谢谢
  • 不,编码sides = scanf("%d", &amp;sides); 是错误的。您不应该像这样使用两次相同的 sides 变量。
【解决方案2】:

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

返回值

成功时,函数返回项目数 成功读取。这个计数可以匹配预期的数量 如果发生匹配失败,读数或更少,甚至为零。在里面 在成功读取任何数据之前输入失败的情况, 返回 EOF。

【讨论】:

  • 这是一个警告,顺便说一句,我在使用 uni 的计算机时没有这个问题
  • 有几个级别的严格性,其中之一将警告视为错误。我想你的意思是the error
  • 抱歉没有具体说明,这是一个被视为错误的警告
  • 如果您告诉我们您的 ide/编译器,我们可以为您提供如何关闭它的信息。
  • 我正在使用 gedit 编写程序并在 ubuntu 上使用标准 xterm 来编译/运行
【解决方案3】:

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", &amp;sides)); 还不够,因为 EOF(这将返回 -1)。这将是非常优雅的。

如果您不想在这种情况下使用未初始化的变量 (sides) 继续您的程序,我认为这是要走的路。

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

【讨论】:

    【解决方案4】:

    您不会在变量中捕获scanf 的返回值。它是读取了多少个字符的计数(作为整数),所以如果这对您很重要,那么捕获它可能会很好。

    【讨论】:

    • 而且它对你很重要,相信我。但这是对成功扫描的项目数的计数,不是个字符。
    • int count = scanf("%d", &amp;sides); 这样无害的东西足以阻止警告。虽然我承认在 gcc 4.6 上,我没有得到同样的警告。
    猜你喜欢
    • 2018-04-02
    • 2021-10-03
    • 2021-01-31
    • 2015-04-06
    • 1970-01-01
    • 2012-08-06
    • 1970-01-01
    • 2015-09-01
    • 1970-01-01
    相关资源
    最近更新 更多