【问题标题】:C: Ignoring return value of scanfC:忽略scanf的返回值
【发布时间】:2018-04-02 11:47:45
【问题描述】:
int main()
{
int i, n, m;

while((scanf("%d",&n))!=EOF)
    {
        int a[n];

        for(i=0; i<n; i++){
            scanf("\n\n%d",&a[i]);}

        scanf("\n\n\n\n%d",&m);

        int b[m];

        for(i=0;i<m;i++){
            scanf("\n\n\n\n\n\n%d",&b[i]);}

        int count=0, place[n];

        for(i=0; i<n; i++){
            if(array_cmp(i,m,a,b)==1){
                count++;
                place[i]=i;
            }
        }
}

我不断收到错误消息, 警告:忽略'scanf'的返回值,用属性warn_unused_result [-Wunused-result]声明

我似乎无法弄清楚出了什么问题。该代码应该以以下格式读取输入:

n

0 0 0 0

0 0 0

n 和 m 是第一个和第二个数组的长度。

【问题讨论】:

  • 可能是因为你正在输入 scanf() 返回的结果。
  • n2 在这里未声明,还有array_cmp..
  • scanf("\n\n\n\n\n\n%d" 等价于scanf("%d"
  • 应该 while((scanf("%d",&amp;n))!=EOF)while((scanf("%d",&amp;n))==1)
  • @EdHeal:是的,测试应该是== 1,因为输入中的字母或标点字符会使scanf() 返回0,因此循环将无限期地继续,但永远不会读取任何数字。

标签: c function gcc scanf


【解决方案1】:

scanf() 返回一个值,而您在所有函数调用中对它做任何事情,除了这里:

scanf("%d",&n))!=EOF

你在哪里实际使用函数返回的东西。

您可以通过使用编译器指定的标志(即-Wno-unused-result)进行编译来避免此消息。


PS:scanf() 中的所有换行符什么都不做,并且会损害可读性,请丢弃它们。

例如,改变这个:

scanf("\n\n\n\n%d",&m);

到这里:

scanf("%d", &m);

注意:生成警告是因为忽略scanf() 的返回值几乎总是一个坏主意。最好在极少数情况下使用(void)scanf(…) 显式转换结果,而您真的不需要担心它是否成功。

【讨论】:

  • 错误,很可能是因为-Werror 已通过。并且该消息意味着 -Wunused-result 已经通过(显式地或编译器默认值),要禁用您需要通过 -Wno-unused-result 的警告。
  • 谢谢!我删除了换行符并添加了 if(scanf()){};问题似乎已解决。
  • 请注意,生成警告是因为忽略scanf() 的返回值几乎总是一个坏主意。最好在极少数情况下使用(void)scanf(…) 显式转换结果,而您真的不需要担心它是否成功。
  • @Rachel:if (scanf(…)){} 符号丑陋得像罪恶一样。您应该检查返回的值,或将其转换为 void
猜你喜欢
  • 1970-01-01
  • 2021-10-03
  • 2021-01-31
  • 2015-04-06
  • 1970-01-01
  • 2012-08-06
  • 1970-01-01
  • 2011-11-08
  • 1970-01-01
相关资源
最近更新 更多