elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Curso de javascript por TickTack


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Porque me sale error al querer imprimir el contenido de la pila
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Porque me sale error al querer imprimir el contenido de la pila  (Leído 3,182 veces)
andresjr22

Desconectado Desconectado

Mensajes: 4


Ver Perfil
Porque me sale error al querer imprimir el contenido de la pila
« en: 31 Julio 2016, 19:51 pm »

El programa tiene que permitir el ingreso de nombre de libros, una vez ingresado se mostrara un mensaje si quiere seguir ingresando si la respuesta es n el programa ordena los libros en orden alfabetico y luego los muestra por pantalla.... Compila pero no ejecuta correctamente , help me please!!!


Código
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4. #include <conio.h>
  5.  
  6. typedef struct nodo{
  7. char libro[100];
  8. struct nodo *siguiente;
  9. }tiponodo;
  10.  
  11. typedef tiponodo *pnodo;
  12. typedef tiponodo *pila;
  13.  
  14. void ingresar(char *a);
  15. void push(pila *p,char a[]);
  16. void ordenar(pila *p);
  17. void mostrar(pila p);
  18.  
  19. int main()
  20. {
  21. pila p=NULL;
  22. char libro[100];
  23. char res='S';
  24.  
  25. while(res=='S'||res=='s')
  26. {
  27. ingresar(libro);
  28. push(&p,libro);
  29. printf(" Desea seguir ingresando: ");
  30. scanf("%s",&res);
  31. }
  32.  
  33. ordenar(&p);
  34. mostrar(p);
  35.  
  36. }
  37.  
  38. void ingresar(char *a)
  39. {
  40. printf("\n Ingrese el nombre del libro: ");
  41. scanf("%s",a);
  42. }
  43.  
  44. void push(pila *p,char a[])
  45. {
  46. pnodo nuevo;
  47. nuevo=(pnodo)malloc(sizeof(tiponodo));
  48. strcpy(nuevo->libro,a);
  49. nuevo->siguiente=*p;
  50. *p=nuevo;
  51. }
  52.  
  53. void ordenar(pila *p)
  54. {
  55. pnodo i,j;
  56. i=*p;
  57. j=*p;
  58. char c[100];
  59.  
  60. while(i!=NULL)
  61. {
  62. while(j!=NULL&&(j->siguiente)!=NULL)
  63. {
  64. if(strcmp(j->libro,(j->siguiente)->libro)>0)
  65. {
  66. strcpy(c,j->libro);
  67. strcpy(j->libro,(j->siguiente)->libro);
  68. strcpy((j->siguiente)->libro,c);
  69. }
  70. j=j->siguiente;
  71. }
  72. i=i->siguiente;
  73. j=i;
  74. }
  75. }
  76.  
  77. void mostrar(pila p)
  78. {
  79. pnodo aux;
  80. aux=p;
  81. while(aux!=NULL)
  82. {
  83. printf("\n El libro es %s",aux->libro);
  84. aux=aux->siguiente;
  85. }
  86. }


« Última modificación: 31 Julio 2016, 20:04 pm por andresjr22 » En línea

AlbertoBSD
Programador y
Moderador Global
***
Desconectado Desconectado

Mensajes: 3.696


🏴 Libertad!!!!!


Ver Perfil WWW
Re: Porque me sale error al querer imprimir el contenido de la pila
« Respuesta #1 en: 31 Julio 2016, 21:02 pm »

Que error da?

para empezar res char y no string, por lo cual el scanf deberia de ser %c o en su defecto usar la funcion getchar

Código
  1. scanf("%c",&res);

Que error te da. No tengo mi laptop  aqui para probar tu programa.

Saludos


En línea

andresjr22

Desconectado Desconectado

Mensajes: 4


Ver Perfil
Re: Porque me sale error al querer imprimir el contenido de la pila
« Respuesta #2 en: 31 Julio 2016, 21:25 pm »

El compilador (Dev C++) no me da la oportunidad de ingresar el dato por pantalla cuando uso %c por eso le pongo %s

Ejecucion con %c sin opcion a ingresar la confirmacion a "Desea seguir ingresando"

 

Ejecucion con %s








« Última modificación: 31 Julio 2016, 21:31 pm por andresjr22 » En línea

AlbertoBSD
Programador y
Moderador Global
***
Desconectado Desconectado

Mensajes: 3.696


🏴 Libertad!!!!!


Ver Perfil WWW
Re: Porque me sale error al querer imprimir el contenido de la pila
« Respuesta #3 en: 31 Julio 2016, 21:59 pm »

Es que el scanf no esta obteniendo el retorno de carro por eso no tw funciona.

La otra es que red solo puede guardar un caracter usar getchar();

Código
  1. res = getchar();

La otra es que tambiene estas haciendo sin darte cuenta un buffer overflow.

Te dejo este video

En línea

andresjr22

Desconectado Desconectado

Mensajes: 4


Ver Perfil
Re: Porque me sale error al querer imprimir el contenido de la pila
« Respuesta #4 en: 31 Julio 2016, 22:57 pm »

Gracias por el video me ayudo a entender muchas cosas, pero sigo sin entender..
Modifique la funcion main un punto ahora esta asi
Código
  1. int main()
  2. {
  3. pila p=NULL;
  4. pnodo a;
  5. char libro[100];
  6. char res[1]={'S'};
  7.  
  8. while(res[0]=='S'||res[0]=='s')
  9. {
  10. a=p;
  11. printf("\n Antes de ingresar la pila tiene un valor de: %s",a->libro);
  12. ingresar(libro);
  13. push(&p,libro);
  14. printf(" Despues de la funcion push y antes de la verificacion en la pila si exite la palabra: %s\n ",p->libro);
  15. printf(" Desea seguir ingresando: ");
  16. scanf("%s",res);
  17. }
  18.  
  19. ordenar(&p);
  20. mostrar(p);
  21.  
  22. }
  23.  

la ejecucion del programa


le puse esos printf para ver hasta que linea de codigo existe el dato en la pila, tal parece despues de la verificacion esta el problema, y no sobrepaso el buffer ya que solo le estoy ingresando un dato a la varibale res....
En línea

AlbertoBSD
Programador y
Moderador Global
***
Desconectado Desconectado

Mensajes: 3.696


🏴 Libertad!!!!!


Ver Perfil WWW
Re: Porque me sale error al querer imprimir el contenido de la pila
« Respuesta #5 en: 1 Agosto 2016, 00:14 am »

tus tipos de datos pnodo y pila son apuntadores a la misma estructura.

En la primera vuelta p vale NULL y lo inicializas en la funcion pila.

Pero en el siguiente ciclo estas usando el mismo p y en ningun momento lo guardas en otra variable.

En teoria no tendras forma de acceder a los datos previamente guardados.

Ya que el P local de Main se esta sobre escribiendo en cada ciclo
En línea

andresjr22

Desconectado Desconectado

Mensajes: 4


Ver Perfil
Re: Porque me sale error al querer imprimir el contenido de la pila
« Respuesta #6 en: 1 Agosto 2016, 01:06 am »

Ya solucione el problema no era eso que me decias, el problema estaba en que la varibel resp estaba declarada como un vector de tamaño 1

Código
  1. char res[1]={'S'}

y por una extraña razon cuando ponia 1 me dañaba el contenido de la pila lo que hice fue cambiarle el tamaño a esa variable y se soluciono todo, parece extraño pero gracias por la ayuda prestada ...

Código
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4. #include <conio.h>
  5.  
  6. typedef struct nodo{
  7. char libro[100];
  8. struct nodo *siguiente;
  9. }tiponodo;
  10.  
  11. typedef tiponodo *pnodo;
  12. typedef tiponodo *pila;
  13.  
  14. void ingresar(char *a);
  15. void push(pila *p,char a[]);
  16. void ordenar(pila *p);
  17. void mostrar(pila p);
  18.  
  19. int main()
  20. {
  21. pila p=NULL;
  22. char libro[100];
  23. char resp[2];
  24. resp[0]='S' ;
  25.  
  26. while(resp[0]=='S'||resp[0]=='s')
  27. {
  28. ingresar(libro);
  29. push(&p,libro);
  30. printf(" Desea seguir ingresando: ");
  31. scanf("%s",&resp[0]);
  32. }
  33.  
  34. ordenar(&p);
  35. mostrar(p);
  36.  
  37. }
  38.  
  39. void ingresar(char *a)
  40. {
  41. printf("\n Ingrese el nombre del libro: ");
  42. scanf("%s",a);
  43. }
  44.  
  45. void push(pila *p,char a[])
  46. {
  47. pnodo nuevo;
  48. nuevo=(pnodo)malloc(sizeof(tiponodo));
  49. strcpy((nuevo->libro),a);
  50. nuevo->siguiente=*p;
  51. *p=nuevo;
  52. }
  53.  
  54. void ordenar(pila *p)
  55. {
  56. pnodo i,j;
  57. i=*p;
  58. j=*p;
  59. char c[100];
  60.  
  61. while(i!=NULL)
  62. {
  63. while(j!=NULL&&(j->siguiente)!=NULL)
  64. {
  65. if(strcmp(j->libro,(j->siguiente)->libro)>0)
  66. {
  67. strcpy(c,j->libro);
  68. strcpy(j->libro,(j->siguiente)->libro);
  69. strcpy((j->siguiente)->libro,c);
  70. }
  71. j=j->siguiente;
  72. }
  73. i=i->siguiente;
  74. j=i;
  75. }
  76. }
  77.  
  78. void mostrar(pila p)
  79. {
  80. pnodo aux;
  81. aux=p;
  82. while(aux!=NULL)
  83. {
  84. printf("\n El libro es %s",aux->libro);
  85. aux=aux->siguiente;
  86. }
  87. }
  88.  


En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
porque me sale este error « 1 2 »
Programación Visual Basic
shadow.darknesses 11 4,015 Último mensaje 20 Enero 2007, 16:29 pm
por shadow.darknesses
porque me sale este error con el reshacker
Dudas Generales
artibano 0 2,239 Último mensaje 26 Junio 2011, 13:09 pm
por artibano
Porque me sale error con esto? {C}
Programación C/C++
Anastacio 4 2,982 Último mensaje 16 Febrero 2012, 19:49 pm
por Anastacio
porque me sale un error al finalizar el programa?
ASM
Belial & Grimoire 4 3,836 Último mensaje 31 Mayo 2012, 18:38 pm
por Eternal Idol
[ASP.NET] ¿Porque me sale el siguiente error? (tags)
.NET (C#, VB.NET, ASP)
Ila26 0 1,654 Último mensaje 3 Marzo 2014, 16:21 pm
por Ila26
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines