为什么printf无法打印杰克和乔治的名字?

时间:2018-12-04 21:15:55

标签: c arrays struct printf

我想知道为什么杰克和乔治的名字无法打印。我尝试在结构中添加另一个成员,这样名称可以正常打印,为什么呢?如果有人可以提供帮助,我将不胜感激。这是代码:

primeusers[1]

1 个答案:

答案 0 :(得分:3)

这是因为您的scanf()错误,并且正在覆盖结构的成员。

一个不错的编译器会发出很多非常严重的警告:

$ gcc -Wall t.c
t.c:13:11: warning: return type of ‘main’ is not ‘int’ [-Wmain]
      void main (void)
           ^~~~
t.c: In function ‘main’:
t.c:22:14: warning: format ‘%d’ expects argument of type ‘int *’, but argument 2 has type ‘u16 *’ {aka ‘short unsigned int *’} [-Wformat=]
     scanf(" %d",&arr[i].salary);
             ~^  ~~~~~~~~~~~~~~
             %hd
t.c:24:14: warning: format ‘%d’ expects argument of type ‘int *’, but argument 2 has type ‘u16 *’ {aka ‘short unsigned int *’} [-Wformat=]
     scanf(" %d",&arr[i].bonus);
             ~^  ~~~~~~~~~~~~~
             %hd
t.c:26:14: warning: format ‘%d’ expects argument of type ‘int *’, but argument 2 has type ‘u16 *’ {aka ‘short unsigned int *’} [-Wformat=]
     scanf(" %d",&arr[i].deduction);
             ~^  ~~~~~~~~~~~~~~~~~
             %hd

呼叫scanf(" %d",&arr[i].salary);时,%d表示将读取的数字存储为int类型。

但是您已经将salary声明为u16类型,这在您的系统上可能比int小得多。 scanf假定您提供%d时您是在讲真话,并且将一个int存储在&arr[i].salary指针指向的任何位置,然后覆盖该变量之后的内存,该变量可能会覆盖{ 1}}数组。

所以

  • 将您的name声明为salary, bonus and deduction而不是int,因此它与您为u16赋予的%d参数匹配 或
  • scanf变量scanf提供u16的正确类型说明符。

例如

%hu