Почему printf не распечатывает имена Джека и Джорджа?

Я хотел бы знать, почему имена Джека и Джорджа не распечатываются. Я попробовал добавить другого члена в структуру, чтобы имена печатались нормально, почему? Я бы очень признателен, если кто-то может помочь. Здесь код:

    #include <stdio.h>
    typedef unsigned short int u16;
    typedef unsigned char u8;
    typedef struct 
    {
     u8 name[10];
     u16 salary;
     u16 bonus;
     u16 deduction;
     //u8 x;//why does the printed name get ruined 
     //without this?
     }employee;
     void main (void)
     {
       employee arr[3]={{.name = "John"},{.name = 
        "Jack"},{.name = "George"}};
       u16 i = 0;
       u16 sum = 0; 
       for (i = 0; i < 3; i++)
{
    printf("\nPlease enter %s Salary:",arr[i].name);
    scanf(" %d",&arr[i].salary);
    printf("\nPlease enter %s Bonus:",arr[i].name);
    scanf(" %d",&arr[i].bonus);
    printf("\nPlease enter %s Deduction:",arr[i].name);
    scanf(" %d",&arr[i].deduction);
    sum = sum + arr[i].salary + arr[i].bonus - arr[i].deduction;
}
    printf("\nTotal value needed is: %d",sum);
}
0
источник поделиться
1 ответ

Это потому, что ваши 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 jsut предполагает, что вы рассказывали правду, когда вы предоставляли %d, и &arr[i].salary int в том, что &arr[i].salary указатель &arr[i].salary, перезаписывая память после этой переменной, которая может перезаписать и уничтожить массив name.

Таким образом, либо

  • объявите свою salary, bonus and deduction как int вместо u16, так что он соответствует аргументу %d вы даете scanf или
  • Предоставьте правильный спецификатор типа scanf для ваших переменных u16, который равен %hu.

например

   scanf(" %hu",&arr[i].salary);
   scanf(" %hu",&arr[i].bonus);
   scanf(" %hu",&arr[i].deduction);
+1
источник

Посмотрите другие вопросы по меткам или Задайте вопрос