2016-11-22 56 views
0

我有这个代码,我不知道为什么之后,我问你是否想介绍另一个学生,我说1或0程序结束并说分段错误(核心转储)。如何解决分段故障(核心转储)?

我请介绍另外一个学生在_nodo *insertaEnLista

#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; 
} 

我该怎么做才能解决这个问题。

回答

0

您应该逐句通过调试器中的代码,并查看每个步骤中的变量以确定导致问题的代码行。

这是一个问题,可能有其他问题。

在这一行

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

您使用strcmp与含有单个字符的变量(respuesta)。 strcmp期望一个空终止的字符串(末尾有一个零字节的字符数组)。正如你可能没有足够的可变后一个零字节,这可能会导致STRCMP读取内存,它不应该(这是一个缓冲区溢出)

简单多了,只需使用:

}while (respuesta == '1');