Test Foro de elhacker.net SMF 2.1

Programación => Programación C/C++ => Mensaje iniciado por: andresjr22 en 31 Julio 2016, 19:51 PM

Título: Porque me sale error al querer imprimir el contenido de la pila
Publicado por: andresjr22 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 (cpp) [Seleccionar]

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

typedef struct nodo{
char libro[100];
struct nodo *siguiente;
}tiponodo;

typedef tiponodo *pnodo;
typedef tiponodo *pila;

void ingresar(char *a);
void push(pila *p,char a[]);
void ordenar(pila *p);
void mostrar(pila p);

int main()
{
pila p=NULL;
char libro[100];
char res='S';

while(res=='S'||res=='s')
{
ingresar(libro);
push(&p,libro);
printf(" Desea seguir ingresando: ");
scanf("%s",&res);
}

ordenar(&p);
mostrar(p);

}

void ingresar(char *a)
{
printf("\n Ingrese el nombre del libro: ");
scanf("%s",a);
}

void push(pila *p,char a[])
{
pnodo nuevo;
nuevo=(pnodo)malloc(sizeof(tiponodo));
strcpy(nuevo->libro,a);
nuevo->siguiente=*p;
*p=nuevo;
}

void ordenar(pila *p)
{
pnodo i,j;
i=*p;
j=*p;
char c[100];

while(i!=NULL)
{
while(j!=NULL&&(j->siguiente)!=NULL)
{
if(strcmp(j->libro,(j->siguiente)->libro)>0)
{
strcpy(c,j->libro);
strcpy(j->libro,(j->siguiente)->libro);
strcpy((j->siguiente)->libro,c);
}
j=j->siguiente;
}
i=i->siguiente;
j=i;
}
}

void mostrar(pila p)
{
pnodo aux;
aux=p;
while(aux!=NULL)
{
printf("\n El libro es %s",aux->libro);
aux=aux->siguiente;
}
}
Título: Re: Porque me sale error al querer imprimir el contenido de la pila
Publicado por: AlbertoBSD 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

scanf("%c",&res);

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

Saludos
Título: Re: Porque me sale error al querer imprimir el contenido de la pila
Publicado por: andresjr22 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"

(http://imageshack.com/a/img924/108/Q2Lru9.png)

Ejecucion con %s

(http://imageshack.com/a/img922/3582/OSaz2f.png)






Título: Re: Porque me sale error al querer imprimir el contenido de la pila
Publicado por: AlbertoBSD 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();

res = getchar();

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

Te dejo este video
[youtube=640,360]https://www.youtube.com/watch?v=mG8_nY3Yzg4[/youtube]
Título: Re: Porque me sale error al querer imprimir el contenido de la pila
Publicado por: andresjr22 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 (cpp) [Seleccionar]

int main()
{
pila p=NULL;
pnodo a;
char libro[100];
char res[1]={'S'};

while(res[0]=='S'||res[0]=='s')
{
a=p;
printf("\n Antes de ingresar la pila tiene un valor de: %s",a->libro);
ingresar(libro);
push(&p,libro);
printf(" Despues de la funcion push y antes de la verificacion en la pila si exite la palabra: %s\n ",p->libro);
printf(" Desea seguir ingresando: ");
scanf("%s",res);
}

ordenar(&p);
mostrar(p);

}


la ejecucion del programa
(https://imageshack.com/i/ply50sygp)

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....
Título: Re: Porque me sale error al querer imprimir el contenido de la pila
Publicado por: AlbertoBSD 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
Título: Re: Porque me sale error al querer imprimir el contenido de la pila
Publicado por: andresjr22 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 (cpp) [Seleccionar]
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 (cpp) [Seleccionar]

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

typedef struct nodo{
char libro[100];
struct nodo *siguiente;
}tiponodo;

typedef tiponodo *pnodo;
typedef tiponodo *pila;

void ingresar(char *a);
void push(pila *p,char a[]);
void ordenar(pila *p);
void mostrar(pila p);

int main()
{
pila p=NULL;
char libro[100];
char resp[2];
resp[0]='S' ;

while(resp[0]=='S'||resp[0]=='s')
{
ingresar(libro);
push(&p,libro);
printf(" Desea seguir ingresando: ");
scanf("%s",&resp[0]);
}

ordenar(&p);
mostrar(p);

}

void ingresar(char *a)
{
printf("\n Ingrese el nombre del libro: ");
scanf("%s",a);
}

void push(pila *p,char a[])
{
pnodo nuevo;
nuevo=(pnodo)malloc(sizeof(tiponodo));
strcpy((nuevo->libro),a);
nuevo->siguiente=*p;
*p=nuevo;
}

void ordenar(pila *p)
{
pnodo i,j;
i=*p;
j=*p;
char c[100];

while(i!=NULL)
{
while(j!=NULL&&(j->siguiente)!=NULL)
{
if(strcmp(j->libro,(j->siguiente)->libro)>0)
{
strcpy(c,j->libro);
strcpy(j->libro,(j->siguiente)->libro);
strcpy((j->siguiente)->libro,c);
}
j=j->siguiente;
}
i=i->siguiente;
j=i;
}
}

void mostrar(pila p)
{
pnodo aux;
aux=p;
while(aux!=NULL)
{
printf("\n El libro es %s",aux->libro);
aux=aux->siguiente;
}
}



(https://imageshack.com/i/pooITsjZp)