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

 

 


Tema destacado: Introducción a Git (Primera Parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Error al imprimir caracteres
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Error al imprimir caracteres  (Leído 2,297 veces)
JoseCheO

Desconectado Desconectado

Mensajes: 13


Ver Perfil
Error al imprimir caracteres
« en: 3 Febrero 2014, 18:09 pm »

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

typedef struct nodo {
   char nombre[20];
   int cedula;
   float precio;
   struct nodo *siguiente;
} tipoNodo;
typedef tipoNodo *pNodo;
typedef tipoNodo *Lista;

Lista lista = NULL;

void InCompra ();
void Insertar(Lista *plista, char nom[20],int pci,float ppre);
int ListaVacia(Lista plista);
void BorrarLista(Lista *);
void MostrarLista(Lista plista);
void Borrar (Lista *plista, int bci);

void InBorrar(){
   
   int c=0;
   printf("Cedula de Comprador a Borra:          ");
   scanf("%d",&c);
   Borrar(&lista,c);
   printf("\n\nComprador Eliminado\n\n");
   
      
}
void mostrar_menu() {
   printf("\n\nMenu:\n=====\n\n");
   printf("1.- Agregar Compra\n");
   printf("2.- Borrar Compra\n");
   printf("3.- Mostrar Lista de Compras\n");
   printf("4.- Salir\n\n");
   printf("Escoge una opcion: ");
   printf("\n \n ");
}
void InCompra(){
   
   char n[20];
   int c;
   float pe;
   printf("\n \n");
   printf("Nueva Compra");
   printf("\n \n");
   printf("Nombre:    ");
   scanf("%20[^\n]",n);
   printf("Cedula:    ");
   scanf("%d",&c);
   printf("\n");
   printf("Precio de Compra:    ");
   scanf("%f",&pe);
   printf("\n");      
   printf("===========================================================");
   printf("\n \n");
   Insertar(&lista, n,c,pe);
   }



void Borrar(Lista *lista, int v) {
   pNodo anterior, nodo;
   
   nodo = *lista;
   anterior = NULL;
   while(nodo && nodo->cedula < v) {
      anterior = nodo;
      nodo = nodo->siguiente;
   }
   if(!nodo || nodo->cedula != v) return;
   else { /* Borrar el nodo */
      if(!anterior) /* Primer elemento */
         *lista = nodo->siguiente;
      else  /* un elemento cualquiera */
         anterior->siguiente = nodo->siguiente;
      free(nodo);
   }   
}

void Insertar(Lista *lista, char no[20],int ci, float pre) {
   pNodo nuevo, anterior;
   /* Crear un nodo nuevo */
   
   nuevo = (pNodo)malloc(sizeof(tipoNodo));
   nuevo->nombre[20] = no[20];
   nuevo->cedula = ci;
   nuevo->precio = pre;
   /* Si la lista está vacía */
   if(ListaVacia(*lista) || (*lista)->precio > pre) {
      /* Añadimos la lista a continuación del nuevo nodo */
      nuevo->siguiente = *lista;
      /* Ahora, el comienzo de nuestra lista es el nuevo nodo */
      *lista = nuevo;
   } else {
      /* Buscar el nodo de valor menor a v */
      anterior = *lista;
      /* Avanzamos hasta el último elemento o hasta que el siguiente tenga
      un valor mayor que v */
      while(anterior->siguiente && anterior->siguiente->precio <=pre)
         anterior = anterior->siguiente;
      /* Insertamos el nuevo nodo después del nodo anterior */
      nuevo->siguiente = anterior->siguiente;
      anterior->siguiente = nuevo;
   }
   
}

int ListaVacia(Lista lista) {
   return (lista == NULL);
}

void BorrarLista(Lista *lista) {
   pNodo nodo;
   while(*lista) {
      nodo = *lista;
      *lista = nodo->siguiente;
      free(nodo);
   }
}

void MostrarLista(Lista lista) {
   pNodo nodo = lista;
   if(ListaVacia(lista)) printf("Lista vacia\n");
   else {
      printf("\nListado General\n");
      while(nodo) {
         printf("-> Nombres: %s     -> Cedula: %d  Precio: %.2f -> \n",nodo->nombre,nodo->cedula,nodo->precio);
         nodo = nodo->siguiente;
      }
      printf("\n");
   }

}


   
int main() {
      
   char opcion;
   
   
   do {
      mostrar_menu();
      opcion = getch();
      switch ( opcion ) {
      case '1': InCompra();
         break;
      case '2':InBorrar();
         break;
      case '3':MostrarLista(lista);
         break;
      case '4': exit( 1 );
      default: printf( "Opcion no valida\n" );
         break;
      }
   } while (opcion!='4');

   return 0;
   
}


Al mostrar lista... me los nombres aparecen unas letras raras


En línea

Belial & Grimoire


Desconectado Desconectado

Mensajes: 559


Tea_Madhatter


Ver Perfil
Re: Error al imprimir caracteres
« Respuesta #1 en: 4 Febrero 2014, 00:31 am »

trata cambiando el scanf de nombres, usa el string %s


En línea

.                                 
x64core


Desconectado Desconectado

Mensajes: 1.908


Ver Perfil
Re: Error al imprimir caracteres
« Respuesta #2 en: 4 Febrero 2014, 02:33 am »

revisa el array nombre puede que el buffer no sea inicializado ya que es una cadena y podrias no copiar el caracter nulo para denotar
la cadena. inicializa el array usando memset
En línea

Yoel Alejandro

Desconectado Desconectado

Mensajes: 254



Ver Perfil WWW
Re: Error al imprimir caracteres
« Respuesta #3 en: 5 Febrero 2014, 04:46 am »

Hola José, estuve probando el código y veo que agrega bien la cédula y el precio, pero no el nombre.

El error está en la asignación del campo nombre. Recuerda que para copiar una cadena en otra no se puede simplemente con el operador de asignación (=), sino que debes hacerlo con strcpy, o mejor aún, para prevenir desbordamiento, con strncpy.

La función
Código:
strncpy( char* dest, char *src, size_t n )
copia un máximo de n caracteres de la cadena origen a la cadena destino. y luego debes agregar manualmente el nulo de terminación. En el código de la función Insertar, la línea:

Código:
nuevo->nombre[20] = no[20];

debe reemplazarse por

Código:
strncpy( nuevo->nombre, no, 20);
(nuevo->nombre)[20] = '\0';

donde los paréntesis en (nuevo->nombre) son necesarios puesto que el operador "[]" tiene mayor precedencia que el de acceso de miembro "->". Con ésto ya tu programa debe quedar bien :)

===================
Por cierto, recomiendo poner un getchar() al final de Imprimir, de manera que la lista permanezca impresa en pantalla hasta que el usuario presione una tecla.
También recuerda que getch() no es una función estándar de C, sino que funciona principalmente en compiladores de C para Windows. Usa getchar().
« Última modificación: 5 Febrero 2014, 04:51 am por yoel_alejandro » En línea

Saludos, Yoel.
P.D..-   Para mayores dudas, puedes enviarme un mensaje personal (M.P.)
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
error al imprimir
ASM
Flamer 8 4,586 Último mensaje 1 Mayo 2012, 02:01 am
por x64core
Error al imprimir cadena de carácteres en C « 1 2 »
Programación C/C++
darg94 14 13,860 Último mensaje 21 Octubre 2012, 15:39 pm
por darg94
Imprimir caracteres en C[Solucionado]
Programación C/C++
Senior++ 8 3,509 Último mensaje 7 Febrero 2013, 22:01 pm
por leosansan
Error al imprimir un arbol en c++
Programación C/C++
Pluging 0 1,429 Último mensaje 19 Marzo 2017, 03:36 am
por Pluging
[PYTHON] Imprimir carácteres Unicode
Scripting
dimineko 1 3,460 Último mensaje 19 Julio 2019, 22:02 pm
por WHK
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines