2016-11-22 5 views
0

Ich habe diesen Code und ich weiß nicht warum, nachdem ich frage, wenn Sie einen anderen Schüler vorstellen wollen und ich sage 1 oder 0 das Programm endet und sagte Segmentierung Fehler (Core Dumped).Wie kann ich den Segmentierungsfehler beheben (Core Dumped)?

Ich frage _nodo *insertaEnLista einen anderen Schüler in

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <stdbool.h> 

struct actividades 
{ 
    char tipoDeActividad[22]; 
    char diaDeLaSemana[12]; 
    char horaDeIncio[8]; 
    char horaDeFin[8]; 
}; 

struct materias 
{ 
    char nombre[30]; 
    char profesor[30]; 
    char tipoDeMateria[20]; 
    struct actividades *actividad; 
}; 

struct alumnos 
{ 
    char nombre[30]; 
    int cedula; 
    int telefono; 
    struct materias *materia; 
    struct alumnos *siguiente; 
}; 

typedef struct alumnos _nodo; 

_nodo *crearLista(_nodo *apuntador); 
bool listaVacia(_nodo *apuntador); 
_nodo *insetarEnLista(char nombre[], long cedula, long telefono, _nodo *apuntador); 
void imprimirLista (_nodo *apuntador); 
_nodo *crearNodo(char nombre[], long int cedula, long int telefono); 

//AQUI SE CREA LISTA Y SE PONE PARA QUE APUNTE A NULL 
_nodo *crearLista(_nodo *apuntador) 
{ 
    return (apuntador = NULL); 
} 

//ESTA FUNCION VERIFICA SI LA LISTA ESTA VACIA 
bool listaVacia(_nodo *apuntador) 
{ 
    if (apuntador == NULL) 
     return (true); 
    else 
     return (false); 
} 

//AQUI SE CREA EL NUEVO NODO DE LA LISTA 

_nodo *crearNodo(char nombre[], long cedula, long telefono) 
{ 
    _nodo *registroNuevo; 

    registroNuevo = (_nodo *) malloc(sizeof(_nodo)); 

    printf("\n----NUEVO ELEMENTO----\n"); 
    printf("NOMBRE: "); 
    fflush(stdin); 
    scanf("%s",nombre); 
    printf("CEDULA: "); 
    fflush(stdin); 
    scanf("%ld", &cedula); 
    printf("TELEFONO: "); 
    fflush(stdin); 
    scanf("%ld", &telefono); 
    fflush(stdin); 

     strcpy(registroNuevo->nombre, nombre); 
     registroNuevo->cedula = cedula; 
     registroNuevo->telefono = telefono; 
     registroNuevo->siguiente = NULL; 

    return registroNuevo; 

} 

//AQUI SE INSERTA EL NODO EN LA LISTA LUGEO DE SER CREADO POR LA FUNCION crearNodo 
_nodo *insetarEnLista(char nombre[], long cedula, long telefono, _nodo *apuntador) 
{ 
    _nodo *registroNuevo, *apuntadorAuxiliar; 
    char respuesta,ch; 

    do 
    { 

      registroNuevo=crearNodo(nombre, cedula, telefono); 
      if (listaVacia(apuntador)) apuntador = registroNuevo; 
      else 
      { 
       apuntadorAuxiliar = apuntador; 
       while (apuntadorAuxiliar->siguiente != NULL) 
        apuntadorAuxiliar = apuntadorAuxiliar->siguiente; 
       apuntadorAuxiliar->siguiente = registroNuevo; 
      } 

      printf("\nPARA INGRESAR A OTRO ALUMNO MARQUE... 1"); 
      printf("\nPARA SALIR MARQUE... '0'\n");   
    while((ch = getchar()) != EOF && ch != '\n');  

    scanf("%c", &respuesta); 
     fflush(stdin); 
    printf("RESPUESTA = %c", respuesta);    

    }while (strcmp(&respuesta, "1")==0); 
    return apuntador; 
} 

//IMPRIMIR LOS NODOS DE LA LISTA 
void imprimirLista (_nodo *apuntador) 
{ 
    _nodo *apuntadorAuxiliar; 

    apuntadorAuxiliar = apuntador; 

    if (apuntador == NULL) 
     printf("NO HAY ELEMENTOS EN LA LISTA \n"); 
    else 
    { 
     while(apuntador != NULL) 
     { 
      printf(" \n------------NODO-------------- "); 
      printf("\nNOMBRE: %s \n\n", apuntadorAuxiliar->nombre); 
      printf("\n\nCEDULA: %d \n", apuntadorAuxiliar->cedula); 
      printf("\nTELEFONO: %d \n", apuntadorAuxiliar->telefono); 

      apuntadorAuxiliar = apuntadorAuxiliar->siguiente; 
     } 
    } 

    return; 
} 

int main() 
{ 
    /*printf("INTRODUZCA LOS NUMEROS DE CEDULA QUE DESEA IMPRIMIR \n");*/ 

    _nodo *inicioLista; 
    int cedula; 
    int telefono; 

    char nombre[20]; 

    inicioLista = crearLista(inicioLista); 

    inicioLista = insetarEnLista(nombre, cedula, telefono, inicioLista); 

    imprimirLista(inicioLista); 

    return 0; 
} 

vorstellen Wie kann ich das Problem zu beheben tun.

Antwort

0

Sie sollten den Code in einem Debugger schrittweise durchlaufen und die Variablen bei jedem Schritt untersuchen, um die Codezeile zu ermitteln, die das Problem verursacht.

Hier ist ein Problem, möglicherweise gibt es andere.

In dieser Zeile

}while (strcmp(&respuesta, "1")==0); 

Sie strcmp mit einer Variablen (respuesta) verwenden, um ein einzelnes Zeichen enthält. strcmp erwartet eine nullterminierte Zeichenfolge (ein Array von Zeichen mit einem Nullbyte am Ende). Wie Sie einen Null-Byte nach den Variablen nicht haben können, kann dies dazu führen, strcmp Speicher zu lesen, dass es nicht soll (dies ein Pufferüberlauf ist)

viel einfacher zu benutzen Sie einfach:

}while (respuesta == '1'); 
Verwandte Themen