Member 13476370 Ответов: 2

Передача массива структур функции, считывающей свои члены


** Определите структуру для представления данных студента, включая
средний балл, студенческий билет и имя студента.
** Напишите функцию, которая считывает данные N студентов.
Моя проблема в том, что: программа не печатает имя, вместо этого она печатает(мусор)и(-1.#QUANO)
кроме того, он считывает только первый элемент массива.

Что я уже пробовал:

#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
typedef struct
{
    float GPA;
    int ID;
    char name[10];
} student;
void read(student arr[],int n)//function that reads student data
{
    int i;
    for(i=0; i<n; i++)
    {
        gets(arr[i].name);
        scanf("%d",&arr[i].ID);
        scanf("%f",&arr[i].GPA);
    }
    return;
}
int main()
{
    int n,i;
    printf("enter number of students:\n");
    scanf("%d",&n);
    student array[n];//array of structs of size n(number of students)
    read(array,n);
    for(i=0; i<n; i++)
    {
        puts(array[i].name);
        printf("/n%d",array[i].ID);
        printf("/n%.2f",array[i].GPA);
    }
    return 0;
}

2 Ответов

Рейтинг:
6

Jochen Arndt

Никогда не смешивайте scanf и gets призывает к вводу данных.

получает - Справочник по c++ [^] будет читать до тех пор, пока (и включительно) новый символ строки, но не сохранит новую строку в буфере.

ссылка на scanf - C++ [^] для несимвольных форматов игнорирует начальные пробелы, но останавливается после чтения запрошенного типа, позволяя новой строке войти во входной буфер.

Ваша первая обработка входных данных-это

scanf("%d",&n);
Это будет считывать число при нажатии клавиши возврата, но позволит ввести новый символ строки во входной буфер. Следующий вызов обработки входных данных-это
gets(arr[i].name);
Поскольку во входном буфере все еще есть символ новой строки, он будет считан и gets() возвращает немедленно, делая переданный буфер пустой строкой!

Так что либо замените gets() звоните с помощью
scanf("%s", arr[i].name);
или
использовать gets() для всех входов:
char buf[32];
gets(buf);
n = atoi(buf);
/* ... */
arr[i].ID = atoi(buf);
arr[i].GPA = atof(buf);

Обратите также внимание на неправильную косую черту в ваших операторах печати. Это должно быть, наверное (с трейлинг новых линий):
printf("%d\n",array[i].ID);
printf("%f\n",array[i].GPA);


Рейтинг:
0

Patrice T

Цитата:
Я не могу найти, что пошло не так, потому что он хорошо скомпилирован!

"кошка летит высоко в небе" - это правильное английское слово и правильная английская грамматика, но оно бессмысленно.
То же самое и с программами, правильного синтаксиса недостаточно.
Цитата:
введенные пользователем данные неправильно хранятся в массиве[]

Это почти не информативно для нас.
У меня есть самодельное решение, используйте отладчик и посмотрите, как ведет себя ваш код и что он действительно делает, это поможет вам определить, где проблема и почему.

Существует инструмент, который позволяет вам видеть, что делает ваш код, его имя отладчик Это также отличный инструмент обучения, потому что он показывает вам реальность, и вы можете увидеть, какие ожидания соответствуют реальности.
Когда вы не понимаете, что делает ваш код или почему он делает то, что он делает, ответ таков: отладчик.
Используйте отладчик, чтобы увидеть, что делает ваш код. Просто установите точку останова и посмотрите, как работает ваш код, отладчик позволит вам выполнять строки 1 на 1 и проверять переменные по мере их выполнения.

Отладчик - Википедия, свободная энциклопедия[^]

Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]
Базовая отладка с помощью Visual Studio 2010 - YouTube[^]
Отладчик здесь, чтобы показать вам, что делает ваш код, и ваша задача-сравнить с тем, что он должен делать.
В отладчике нет никакой магии, он не находит ошибок, он просто помогает вам. Когда код не делает того, что ожидается, вы близки к ошибке.


Member 13476370

Я уже знаю понятие "отладчик" .. конечно, я опубликовал свой вопрос после того, как отладчик не очень помог .. кстати, отладчик не помогает вам найти, где логика идет не так в каждой программе ..

Patrice T

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

Member 13476370

Это основной элементарный шаг, чтобы использовать его :D
хотя ваше решение каждой проблемы здесь-один и тот же"отладчик"
во всяком случае , thnx

Patrice T

Отладчик-это решение, которое я использую.
Если бы я использовал отладчик для вашего кода, я бы более или менее выполнил то, что Йохен сообщил в решении 2.