2016-11-22 15 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

デバッガでコードをステップ実行し、各ステップの変数を調べて、問題の原因となっているコード行を特定する必要があります。

ここには1つの問題があります。

あなたは、単一の文字が含まれている変数( respuesta)と strcmpを使用している。このラインで

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

strcmpは、ヌル終了文字列(末尾にゼロバイトの文字配列)が必要です。あなたは変数の後にゼロバイトを持たないかもしれないように、これはstrcmpのはそれだけで使用する

はるかに簡単な(これはバッファオーバーランである)べきではないとメモリを読み取ることが原因となることがあります。

}while (respuesta == '1'); 
関連する問題