C - аргументы объекта scanf - PullRequest
0 голосов
/ 14 июля 2020

Я новичок в C. Я пытаюсь сделать функцию addStudent() следующим образом:

В настоящее время я застрял над двумя проблемами:

  1. Независимо от того, что я ввел, имя объекта, середина , и final остаются пустыми или равными нулю.
  2. Если я изменю параметр name на *name, он будет принимать только первый символ. ie, если введено "James", требуется только "J".

ОБНОВЛЕНИЕ: Сначала я подумал, что это проблема scanf, но даже когда я удалил его и инициализировал переменные, объект std все еще пуст. Мне все еще было интересно, как правильно передавать аргументы новому объекту, как в этом примере.

void addStudent(struct Student array[SIZE], int *currentSize){
    char name[20];
    int mid, final;
    printf("Enter name: ");
    scanf("%s", name);
    printf("Enter midterm grade: ");
    scanf("%d", &mid);
    printf("Enter final grade: ");
    scanf("%d", &final);
    struct Student std = {*name, mid, final};
    array[0] = std;
    ++*currentSize;
}

Структура ученика:

struct Student{
    char name[20];
    int midterm;
    int final;
};

ИСПРАВЛЕНО: Если я напрямую передал переменные в scanf, все работало нормально.

void addStudent(struct Student array[], int *currentSize){
    printf("Enter name: ");
    scanf("%s", array[*currentSize].name);
    printf("Enter midterm grade: ");
    scanf("%d", &array[*currentSize].midterm);
    printf("Enter final grade: ");
    scanf("%d", &array[*currentSize].final);
    
    ++*currentSize;
}

1 Ответ

1 голос
/ 14 июля 2020
Спецификатор формата

%s с scanf() считывает ввод, разделенный пробелами. Другими словами, он не может прочитать «полный» ввод, содержащий пробелы.

Цитирование C11, глава 7.21.6.2

s

Соответствует последовательности символов, отличных от пробелов. [....]

Вы должны использовать fgets() для чтения ввода, а затем его обработки.

Тем не менее, изменение аргумент от %s до *name в любом случае неверен, поскольку он создает несоответствие между ожидаемым (указатель на массив символов) и фактическим (символом), создавая неопределенное поведение .

...