Dev - C++ - ayuda con un problema de segmentación en mi programa

 
Vista:
sin imagen de perfil
Val: 1
Ha aumentado su posición en 3 puestos en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

ayuda con un problema de segmentación en mi programa

Publicado por diego (1 intervención) el 01/01/2019 16:24:22
La funcion me sirve bien al usarla sin el switch y el do-while, pero al meterlo me da problema de segmentación, ayuda por favor.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
#include<string.h>
 
 
 struct Disco {
        char titulo[20];
        char artista[20];
        int fecha;
        char formato[3];
        float precio;
        struct Disco *siguiente;
        };
 
//struct Disco *primero, *ultimo; //variables globales que cambiaran cada vez que utilicemos el programa, necesitamos tener la direccion del primer nodo y el ultimo para luego recorrer la lista
 
void agregar(struct Disco **lista, struct Disco **primero) {     //añadir nodos al final de la lista
	struct Disco *nuevo;             //nodo a agregar que declaramos como una variable local
	struct Disco *ultimo;
    nuevo = (struct Disco *) malloc (sizeof(struct Disco)); //reservamos la memoria del nodo, que tendra el mismo almacenamiento de su estructura
    if (nuevo==NULL){
    printf( "No hay memoria disponible.\n");
   }
      printf("Dame el titulo del disco:\n");
      scanf(" %s", &nuevo->titulo);
      printf("Dame el nombre del artista:\n");
      scanf(" %s", &nuevo->artista);
      printf("Dame la fecha:\n");
      scanf(" %d", &nuevo->fecha);
      printf("Dame el formato:\n");
      scanf(" %s", &nuevo->formato);
      printf("Dame el precio:\n");
      scanf(" %f", &nuevo->precio);
 
      nuevo->siguiente = NULL; //cada nodo a agregar apuntura a NULL para agregarse al final de la lista
 
      if (*primero==NULL) { //verificamos si la lista esta vacia o no, entonces al agregar el nuevo nodo aqui justificamos que es el primero y ultimo en la lista
         *primero = nuevo;
         ultimo = nuevo;
         }
      else {//en el caso de tener nodos previos
	ultimo=*lista;
	ultimo->siguiente = nuevo; //el ultimo nodo ubicado en la lista apuntura al nuevo que agregamos
    ultimo = nuevo; //indicamos que el nuevo nodo es el ultimo en la lista
      }
      *lista=ultimo;
      return;
 }
 
 void todos(struct Disco **primero) {
    struct Disco *aux; //declaro una variable local para mostar cada nodo
      char op;
      aux = *primero;
 
      if(aux==NULL) printf("\nla lista esta vacia");
 
      else{
    do{
      while (aux!=NULL) {//pongo como limite que aux sea diferente de NULL porque al cumplirse significara que llego al limite de la lista 
        printf("\n> Titulo: %s\n", aux->titulo);
        printf("> Artista: %s\n", aux->artista);
        printf("> Fecha: %d\n", aux->fecha);
        printf("> Formato: %s\n", aux->formato);
        printf("> Precio: %f\n", aux->precio);
 
  printf("Ver los datos de otro disco? (s/n)\n");
  scanf(" %c",&op);
 
  op = toupper(op);
 
  if(op=='S'){
      aux = aux->siguiente;
  }
  else if(op=='N'){
      aux = NULL;
  }
      }
	  }while(op!='S' && op!='N');}
	  return;
}
 
 int confirmar(){
  char respuesta;
  do{
  printf("¿Seguro que desea salir del programa (s/n):");
  scanf(" %c",&respuesta);
  if((respuesta== 's')||(respuesta== 'S')){
    printf("Ha seleccionado \"\"\n");
    return 1;
  }
  if ((respuesta== 'n')||(respuesta== 'N')){
    printf("Ha seleccionado \"No\"\n");
    return 0;
  }} while ((respuesta!= 'n')||(respuesta!= 'N')||(respuesta!= 's')||(respuesta!= 'S'));
  return 0;
}
 
int main(){
	int op,x=0;
	struct Disco *lista;
	struct Disco *primero;
	primero=NULL;
 
do{
 
	printf("escoga una opcion:\n1-agregar\n2-todo\n3-eliminar\n4-salir\n");
	scanf("%i",&op);
	lista=NULL;
    switch(op){
 
        case 1:
        agregar(&lista,&primero);
        break;
 
        case 2:
        todos(&primero);
        break;
 
        case 3:
        eliminar(&primero);
        break;
 
        case 4:
        x=confirmar();
        break;
 
        default:
        printf("no escogio ninguna de las anteriores");
        break;
    }
 
	}while(x==0);
	  printf("\n\nsalio");
	  return 0;
}
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

ayuda con un problema de segmentación en mi programa

Publicado por Tom (65 intervenciones) el 03/01/2019 11:30:24
Eso parece c. Hay otro foro para estas consultas.
¿ "problema de segmentación" ? ¿ qué es eso ?
Separa tus procesos, y te será más fácil ver los errores.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
#include<string.h>
 
struct Disco {
	char titulo[20];
	char artista[20];
	int fecha;
	char formato[3];
	float precio;
	struct Disco *siguiente;
} *lista = NULL, *last = NULL;
/* */
struct Disco readDisco()
{
	struct Disco res = {0};
 
	// MAL. No hay ningún control sobre el numero de caracteres de entrada
	printf("Dame el titulo del disco:\n");
	scanf(" %s", &res.titulo);
	printf("Dame el nombre del artista:\n");
	scanf(" %s", &res.artista);
	printf("Dame la fecha:\n");
	scanf(" %d", &res.fecha);
	printf("Dame el formato:\n");
	scanf(" %s", &res.formato);
	printf("Dame el precio:\n");
	scanf(" %f", &res.precio);
 
	return res;
}
/* */
void printDisco(struct Disco *disco)
{
	printf("\n> Titulo: %s\n", disco->titulo);
	printf("> Artista: %s\n", disco->artista);
	printf("> Fecha: %d\n", disco->fecha);
	printf("> Formato: %s\n", disco->formato);
	printf("> Precio: %f\n", disco->precio);
}
/* */
void agregar(struct Disco disco)
{
	struct Disco *alloc = malloc(sizeof (struct Disco));
	if(alloc) {
		*alloc = disco;
		alloc->siguiente = NULL;
	} else {
		perror("Storing data");
		exit(1);
	}
	if(!lista) {
		lista = last = alloc;
	} else {
		last->siguiente = alloc;
	}
}
/* */
char si_no(char msg[])
{
	char res;
	do {
		printf("%s (S/N)\n", msg);
		scanf(" %c", &res);
		res = toupper(res);
	} while((res != 'S') && (res != 'N'));
	return res;
}
 
/* */
void todos()
{
	char cont = 'S';
 
	if(lista == NULL) {
		printf("\nla lista esta vacia");
		return;
	}
	for(struct Disco *aux = lista; aux && (cont == 'S'); aux = aux->siguiente) {
		printDisco(aux);
                cont = si_no("¿Ver los datos de otro disco?");
	}
}
 
/* */
int confirmar()
{
	char respuesta = si_no("¿Seguro que desea salir del programa?");
	return respuesta == 'S';
}
 
int main()
{
	int op, x = 0;
 
	do {
		printf("escoga una opcion:\n1-agregar\n2-todo\n3-eliminar\n4-salir\n");
		scanf("%i", &op);
		lista = NULL;
		switch(op) {
		case 1:
			agregar(readDisco());
			break;
		case 2:
			todos();
			break;
		case 3:
			// Eliminar que ?
			break;
		case 4:
			x = confirmar();
			break;
		default:
			printf("no escogio ninguna de las anteriores");
			break;
		}
	} while(x == 0);
	printf("\n\nsalio");
	return 0;
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar