【问题标题】:On compiling the below code compiler showing warning在编译下面的代码编译器显示警告
【发布时间】:2017-11-28 20:10:55
【问题描述】:
#include<stdio.h>

struct employee
{
  char name[25] ;
  int id ;
  int age ;
  float inc ;
} b[3] ;

int main()
{
  int i ;
  for(i = 0 ; i < 3 ; i++)
  {
    printf("Enter name , id , age , inc of employee %d :- ",i+1) ;
    scanf("%s%d%d%f",&b[i].name,&b[i].id,&b[i].age,&b[i].inc) ;
  }
  printf("\n") ;
  for(i = 0 ; i < 3 ; i++)
  {
    printf("%s%d%d%f\n",b[i].name,b[i].id,b[i].age,b[i].inc) ;
  }
  return 0 ;
}

编译输出:

警告:格式“%s”需要“char ”类型的参数,但参数的类型为“char ()[25]”[-Wformat=] scanf("%s%d%d%f",&b[i].name,&b[i].id,&b[i].age,&b[i].inc) ;

如何修复警告?

【问题讨论】:

  • b[i].name 上不需要&amp;
  • 数组名称,如b[i].name,将decay to a pointer。不需要&amp;
  • @KevinDTimm 在scanf 你可以。
  • @HenriMenke - 不,你没有
  • 您是否尝试过引用 C 引用?甚至还有一个工作示例:cplusplus.com/reference/cstdio/scanf

标签: c


【解决方案1】:

&amp;b[i].name 是一个指向char 数组的指针(它是一个char (*)[25]),但scanf 想要一个指向char 的指针(一个char*)。

你需要传递一个指向数组第一个元素的指针。

您可以使用 &amp;b[i].name[0] 显式获取它,或者仅使用 b[i].name 依赖隐式转换

【讨论】:

    【解决方案2】:

    b[i].name 上不需要 &amp;,因为它已经分解为指向第零个元素的指针

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-05-05
      • 2011-05-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多