scanf到结构数组时的分段错误(已更正)

时间:2014-06-29 21:21:44

标签: c arrays

这个典型的学生管理案例让我发疯 我必须完成scanf到一个结构数组 在第一次扫描后我得到分段错误。 我几乎可以肯定我需要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 ("\n\n\n\n\n\n\#####      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 ALUMNO\n---------------------------\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);
}

3 个答案:

答案 0 :(得分:1)

%d格式字符串用于读取int但您正在尝试读取字符串。请尝试将格式字符串更改为正确的%s。请注意,我还包含了一个 width 说明符,以避免输入缓冲区溢出。

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

修改已更新的问题:

scanf()函数需要接收值的变量的地址。这允许函数修改变量的内容。您读取padron值的行应为:

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

请注意在第二个参数之前添加的&(address-of)运算符。

答案 1 :(得分:0)

使用此

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

因为name是字符数组,您最有可能将名称视为字符串,因此应使用%s代替%d

使用fgets获得更好的结果。 Thanx到@mafso

答案 2 :(得分:0)

您正在将scanfgetch混合。所以在调用scanf(要求你点击Return)之后,输入流中仍然有一个Return字符。假设输入流中没有其他额外字符,在getch之后再次调用scanf吃掉返回字符就足够了。

更易于管理的解决方案是使用scanf("%d", &opcion)并将case '1':更改为case 1:。或者,您可以将scanf("%c")char变量一起使用。

编辑:我认为Blastfurnace已经确定了您当前的问题。但是我提出这个问题会很快给你带来麻烦。