【问题标题】:Scanf statementScanf 语句
【发布时间】:2013-04-07 09:50:12
【问题描述】:
#include <stdio.h>
#include <stdlib.h>

你好,我想知道为什么这个程序不执行。似乎我一直无法正确执行 scanf 功能。我得到以下错误:

错误:忽略使用属性 warn_unused_result 声明的 scanf 的返回值

注意:我知道有一种更有效的方法来编写我当前的程序,但这不是重点。我想知道这个错误是什么意思,为什么我不断得到它,可能还有一个解决方案。谢谢你们。代码如下:

int main (int argc, char *argv[]){

    int x;
    int y;
    int z;
    int temp;

    scanf("%d", &x);
    scanf("%d", &y);
    scanf("%d", &z);

        if (x > y) {
           temp = x;
           x = y;
           y = temp;
        }

        if (y > z) {
            temp = y;
            y = z;
            z = temp;
        }

        if (x > z) {
            temp = x;
            x = z;
            z = temp;
        }

        printf("%d", x);
        printf("%d", y);
        printf("%d", z);

  return EXIT_SUCCESS; }

【问题讨论】:

  • 你是否使用 -Werror 进行编译?
  • 这通常不是错误,而是警告。它告诉您您没有使用 scanf 的返回值,这可能是也可能不是错误(在这种情况下,可能不是)。将编译器的警告级别降低一个档次。
  • @Thomas:恕我直言,认为这是一个错误是正确的。 scanf 将返回成功解析到给定变量中的令牌数,因此继续使用 x/y/z 而不确保它们实际上被赋予了值是不正确的。
  • @DCoder 我同意你的看法。我不确定,因为这看起来像初学者代码,所以错误检查可能不是 OP 所追求的。再读一遍,我认为你是对的。
  • @Thomas 人类是最难预测的通信设备。我建议这 is 是一个错误,如果不在这里,那么别无他处。返回值当然应该在这里检查。

标签: c scanf


【解决方案1】:

你从编译器得到的错误就是它所说的。为了使您的应用程序正确,您必须检查 scanf 的返回值。 man page 中描述了可能的返回值。

有关导致错误的原因的说明,请参阅gcc manual 的“warn_unused_result”部分(引用于 Peter R.s 回复)。

【讨论】:

    【解决方案2】:

    来自 GCC 文档:

    warn_unused_result 属性导致发出警告 如果具有此属性的函数的调用者不使用其 返回值。这对于不检查 结果要么是一个安全问题,要么总是一个错误,例如 realloc.

          int fn () __attribute__ ((warn_unused_result));
          int foo ()
          {
            if (fn () < 0) return -1;
            fn ();
            return 0;
          }
    

    导致第 5 行出现警告。

    【讨论】:

      猜你喜欢
      • 2019-03-17
      • 1970-01-01
      • 1970-01-01
      • 2021-04-09
      • 2017-05-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-16
      相关资源
      最近更新 更多