Не отображаются все данные в C с использованием struct

#c #struct #io #printf

#c #struct #io #printf

Вопрос:

Итак, у меня есть эта простая программа на C, над которой я работаю, чтобы помочь мне понять структуры. В этом нет ничего слишком сложного. Однако, когда он доходит до точки, где он должен отображать данные, он отображает только часть данных. Программа запрашивает у пользователя имя и фамилию, затем сумму. Тогда в нем должны отображаться имя и фамилия, а также сумма. Он не отображает фамилию. Я уверен, что это, вероятно, что-то простое, но я не уверен, чего мне здесь не хватает.

Вот код:

     #include <stdio.h>
    #include <stdlib.h>

    #define NAMESIZE 30 

    struct data{
         float amount;
         char firstName[NAMESIZE];
         char lastName [NAMESIZE];
    }record;

    int main()
    {
         printf("nEnter the donor's first and last names n");
         printf("Separate names by a space: ");
         scanf("%s, %s", record.firstName, record.lastName);
 
         char c;
         while ( (c = getchar()) != 'n' amp;amp; c != EOF )
              {
         }
 
         // At this point the program does not work correctly
         // It will just print the first name not the last name
         printf("nEnter the donation amount: ");
         scanf("%f", amp;record.amount);

         // Display the information
         printf("nDonor %s %s gave $%.2f n", record.firstName, record.lastName, record.amount);

    return 0;
     }
  

Любые предложения по этому поводу были бы с благодарностью приняты. Спасибо

Как только я избавился от лишней запятой в первом вызове scanf, это сработало. Вот строка, которая была исправлена:

              scanf("%s %s", record.firstName, record.lastName);
  

У меня была запятая между двумя% s, и это было неверно.

Комментарии:

1. Всегда проверяйте возвращаемое значение scanf. В коде, в printf котором указано «Разделять имена пробелом», но в scanf есть запятая. Каков фактический ввод?

2. 1) Загляните в свой отладчик, чтобы узнать, есть ли у вас фамилия. Вы используете отладчик, верно? 2) Проверьте возвращаемое значение (например, iret = scanf() , чтобы убедиться, что прочитанный # / items равен «2». Проверка возвращаемых значений — это хорошо 🙂 3) Избавьтесь от запятой: измените на iret = scanf("%s %s", record.firstName, record.lastName);

3. scanf("%s, %s", <...>); —> scanf("%s %s", <...>);

4. Я думал, что запятая должна быть там, чтобы scanf работал должным образом?

5. Спасибо paulsm4 и пользователю 12986714, как только я внес это изменение, оно сработало так, как должно, спасибо, что указали на мою простую ошибку.

Ответ №1:

Или, может быть, можно использовать fgets, защищенные от переполнения буфера, и использовать strtok для разделения интервала

 #include <stdio.h>
#include <stdlib.h>
#include <string.h>

    #define NAMESIZE 30 

    struct data{
         float amount;
         char firstName[NAMESIZE];
         char lastName [NAMESIZE];
    }record;

    int main()
    {
        char *name = malloc(NAMESIZE);
        if (name == NULL) {
        printf("No memoryn");
        return 1;
        }

         printf("nEnter the donor's first and last names n");
         printf("Separate names by a space: ");
         //scanf("%s, %s", record.firstName, record.lastName);
         fgets(name, NAMESIZE, stdin);

        if ((strlen(name) > 0) amp;amp; (name[strlen (name) - 1] == 'n'))
            name[strlen (name) - 1] = '';

        //split name
    int init_size = strlen(name);
    char delim[] = " ";

    char *ptr = strtok(name, delim);
    int idx = 0;
    while(ptr != NULL)
    {
        printf("%d '%s'n",idx, ptr);
                if(idx == 0){
          strcpy(record.firstName, ptr);
                }
                else{
                  strcpy(record.lastName, ptr);
        }
        ptr = strtok(NULL, delim);
        idx  = 1;
    }

     /*
         char c;
         while ( (c = getchar()) != 'n' amp;amp; c != EOF )
              {
         }
         */
         // At this point the program does not work correctly
         // It will just print the first name not the last name
         printf("nEnter the donation amount: ");
         scanf("%f", amp;record.amount);

         // Display the information
         printf("nDonor %s %s gave $%.2f n", record.firstName, record.lastName, record.amount);

    free(name);
    return 0;
     }