es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

No se puede imprimir los datos de una estructura en C.

Mi objetivo aquí es imprimir los datos de los estudiantes contenidos en la estructura.

Mi pregunta es por qué no puedo imprimir los datos de la estructura.

Aquí está mi código:

typedef struct _STUDENT{
    char fullname[50];
    int ID;
    float scores[6];
} STUDENT;

void input(STUDENT* student){
    fflush(stdin);
    printf("\nIngrese el nombre completo del estudiante: ");
    scanf("%s", student->fullname);
    printf("\nIngrese el ID: ");
    scanf("%d", &student->ID);
    for(int i = 0; i < 6; i++){
        printf("\nIngrese la calificación para el curso %d: ", i+1);
        scanf("%f", &student->scores[i]);
    }
}

void output(STUDENT* student){
    printf("\nNombre completo del estudiante: %s", student->fullname);
    printf("\nID del estudiante: %d", student->ID);
    for(int i = 0; i < 6; i++){
        printf("\nCalificación del estudiante: %f", student->scores[i]);
    }
}

int main(){
    STUDENT* students;
    int size;
    printf("Ingrese el número de estudiantes: ");
    scanf("%d",&size);

    students = (STUDENT*)calloc(size,sizeof(STUDENT));

    for(int i =0;i<size;i++){ input(students+i);="" }="" for(int="" i=""></size;i++){><size;i++){
        output(students+i);
    }
    return 0;
}

aquí está la salida:

nombre completo del estudiante: ?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
id del estudiante: 50
calificación del estudiante: 0.000000
calificación del estudiante: 0.000000
calificación del estudiante: 0.000000
calificación del estudiante: 0.000000
calificación del estudiante: 0.000000
calificación del estudiante: 0.000000

en la función output intento imprimir algunos datos pero ninguno se ha impreso. output(students+i);=”” }=”” return=”” 0;=”” }=”” ="" aquí="" está="" la="" salida:="" nombre="" completo="" del="" estudiante:="" id="" del="" estudiante:="" 50="" calificación="" del="" estudiante:="" 0.000000="" calificación="" del="" estudiante:="" 0.000000="" calificación="" del="" estudiante:="" 0.000000="" calificación="" del="" estudiante:="" 0.000000="" calificación="" del="" estudiante:="" 0.000000="" calificación="" del="" estudiante:="" 0.000000="" en="" la="" función="" `output`="" intento="" imprimir="" algunos="" datos="" pero="" ninguno="" se="" ha=""></size;i++){
output(students+i);
}
return 0;
}

aquí está la salida:

nombre completo del estudiante: ?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
id del estudiante: 50
calificación del estudiante: 0.000000
calificación del estudiante: 0.000000
calificación del estudiante: 0.000000
calificación del estudiante: 0.000000
calificación del estudiante: 0.000000
calificación del estudiante: 0.000000

en la función output intento imprimir algunos datos pero ninguno se ha impreso.>

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Parece que el problema está con la función scanf utilizada en la función input para obtener los valores de entrada del usuario. Específicamente, el especificador de formato %s utilizado con scanf se utiliza para leer una cadena de caracteres, pero fullname es solamente un puntero a un carácter. Por lo tanto, scanf no sabe la ubicación adecuada en la memoria para almacenar el valor de entrada.

    Para solucionar esto, debes utilizar el especificador de formato %m en lugar de %s para asignar memoria dinámicamente a fullname utilizando la función malloc. Aquí tienes una versión actualizada de la función input con este cambio:

    void input(STUDENT* student){
        fflush(stdin);
        printf("\nIntroducir el nombre completo del estudiante: ");
        scanf("%m[^\n]", &student->fullname);
        printf("\nIntroducir el ID: ");
        scanf("%d", &student->ID);
        for(int i = 0; i < 6; i++){
            printf("\nIntroducir la nota para el curso %d: ", i+1);
            scanf("%f", &student->scores[i]);
        }
    }
    

    Con este cambio, fullname debería contener correctamente el valor introducido y ser imprimible.

Comments are closed.