Ошибка сегментации при сканировании в массив структур (ИСПРАВЛЕНО)

#c #arrays

#c #массивы

Вопрос:

Этот классический пример управления студентами сводит меня с ума, я должен выполнить сканирование в массив структур После первого сканирования, я получаю ошибку сегментации. Я почти уверен, что мне нужно что-то malloc, но я борюсь с этим со вчерашнего дня, и мне действительно нужна помощь Проблема в %d scanf была моей ошибкой при редактировании программы, чтобы опубликовать ее здесь.. Теперь мне удалось опубликовать его полностью..

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

const int cantidadalumnos = 50;
const int cantidadmaterias = 300;
struct AlumnoData
{
    int padron;
    int dni;
    char apellido[20];
    char nombres[20];
    int edad;
    char dir[30];
    char localidad [20];
    char provincia [20];
    int ingreso;
    int codcar;
};
struct MateriaData
{
    int codmat;
    char Materia[20];
    int anio;
    int cuat;
    int numcurso [20];
    int nota;
    int libro;
    int folio;
};
int main()
{
    int indicealumno;
    indicealumno = 0;
    int indicemateria;
    struct AlumnoData alumno[cantidadalumnos];
    struct MateriaData materia [cantidadmaterias];
    char opcion;
    int intop;
    do
    {
        printf ("nnnnnn#####      Gestion de alumnos      #####n/ / / / / / / / / / / / / / /");
        printf ("n  1. Ingresar alumno");
        printf ("n  2. Buscar un alumno por padron");
        opcion = getch();
        intop = opcion;
        switch (intop)
        {
        case '1' :
            printf ("-------------INGRESO DE ALUMNOn---------------------------n");

            for (indicealumno = 0 ; indicealumno<cantidadalumnos; indicealumno  )
            {
                printf("La cantidad de alumnos hasta el momento es de %d de %d", indicealumno, cantidadalumnos);
                printf("nPadron:");
                scanf("%d", alumno[indicealumno].padron);
                break;
            };
            break;
        }
    }
    while (opcion !=27);
}
  

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

1. Я предполагаю, что вы хотите break , чтобы in case '1' находился вне for цикла.

Ответ №1:

Строка %d формата используется для чтения int , но вы пытаетесь прочитать символьную строку. Вместо этого попробуйте изменить строку формата на правильную %s . Обратите внимание, что я также включил спецификатор ширины, чтобы избежать переполнения входного буфера.

 scanf("s", alumno[stdindex].name);
  

Редактировать для обновленного вопроса:

scanf() Функции требуется адрес переменных, которые должны получать значения. Это позволяет функции изменять содержимое переменной. Строка, в которой вы считываете padron значение, должна быть:

 scanf("%d", amp;alumno[indicealumno].padron);
  

Обратите amp; внимание на оператор (address-of), добавленный перед вторым параметром.

Ответ №2:

Используйте это

 scanf("%s",alumno[stdindex].name);
  

поскольку имя является массивом символов, и вы, скорее всего, рассматриваете имя как строку, поэтому %s его следует использовать вместо %d .

используйте fgets для лучшего результата. Спасибо @mafso

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

1. Поощрять людей к использованию scanf("%s"... определенно нехорошо…

2. это я знаю, но, скорее всего, пользователь знает побочные эффекты scanf.

3. Побочный эффект UB, если пользователь вводит более 19 символов без пробелов? fgets Вместо этого предложите…

4. Да, я знаю, что scanf завершается с любым символом пробела, будь то пробел.

5. Исправлено, ошибка в scanf не была основной проблемой.. Основная проблема заключается в выделении памяти из-за ошибки сегментации, и я думаю, что мне нужно использовать malloc.

Ответ №3:

Вы смешиваете scanf с. getch Таким образом, после вызова scanf (который требует, чтобы вы нажали Return) во входном потоке все еще остается символ возврата. Предполагая, что во входном потоке нет других дополнительных символов, может быть достаточно снова вызвать getch after scanf , чтобы съесть возвращаемый символ.

Более управляемым решением является использование scanf("%d", amp;opcion) и изменение case '1': to case 1: . Или вы можете использовать scanf("%c") с char переменной.

Редактировать: я думаю, что Blastfurnace определил вашу текущую проблему. Но эта проблема, которую я поднимаю, скоро вызовет у вас проблемы.