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

 

 


Tema destacado: (TUTORIAL) Aprende a emular Sentinel Dongle By Yapis


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

Desconectado Desconectado

Mensajes: 218


¡El conocimiento es de todos!


Ver Perfil
Problemas con printf();
« en: 19 Octubre 2015, 04:36 am »

¡Buenas a todos!

Estoy haciendo un pequeño "compilador". Lo que debe hacer es traducir de mi lenguaje a lenguaje C para linux. El caso es que al cargar las palabras en un arrayList de char* lo carga bien dentro de la funcion cargaListaPalabras(codigoTraductor,listaPalabras); e imprime correctamente las palabras de listaPalabras, pero cuando  intento imprimir las palabras de listaPalabras fuera de cargaListaPalabras(); no imprime nada....

Este es el codigo de cargaListaPalabras que funciona correctamente:
Código
  1. void cargaListaPalabras(char* codigo,char* listaPalabras[]){
  2.  
  3.  char palabra[100]="";
  4.  int posPalab=0;
  5.  int posCodigo=0;
  6.  int posListaPalabras=0;
  7.  
  8.  
  9.  printf("codigo: %s\n",codigo);
  10.  
  11.  while(posCodigo<strlen(codigo)){
  12.    while( ((esLetra(codigo[posCodigo])>0) || (esNumero(codigo[posCodigo])>0)) && (codigo[posCodigo]!='\0')){
  13.      //lee letras y numeros hasta formar una palabra
  14.      palabra[posPalab]=codigo[posCodigo];
  15.      posPalab++;
  16.      posCodigo++;
  17.    }
  18.    palabra[posPalab]='\0';                                    //finaliza la palabra
  19.    listaPalabras[posListaPalabras]=palabra;        //guarda palabra en listaPalabra
  20.    printf("%s\n",listaPalabras[posListaPalabras]);   //imprime bien
  21.    posListaPalabras++;
  22.    posPalab=0;
  23.  
  24.    while( (esLetra(codigo[posCodigo])==0) && (codigo[posCodigo]!='\0') ){
  25.      //lee caracteres (comillas, puntos, coma) para guardarlos como una palabra individualmente
  26.      palabra[posPalab]=codigo[posCodigo];
  27.      palabra[posPalab+1]='\0';
  28.      posCodigo++;
  29.      posPalab=0;
  30.      listaPalabras[posListaPalabras]=palabra;   //guarda el caracter en listaPalabras
  31.      printf("%s\n",listaPalabras[posListaPalabras]);   //imprime bien
  32.      posListaPalabras++;
  33.    }
  34.  
  35.  }
  36.  listaPalabras[posListaPalabras]="@fin@";  //palabra de fin de codigo.
  37.  printf("%s\n",listaPalabras[posListaPalabras]);   //imprime bien
  38. }
  39.  

Los printf() de la funcion anterior imprimen el codigo correctamente. Pero cuando en la funcion main() escribo lo siguiente y no funciona el printf() y saca un salto de linea por palabra...

Código
  1.   char* listaPalabras[1000000];
  2.   int posListaPalabras=0;  
  3.  
  4.  cargaListaPalabras(codigoTraductor,listaPalabras);
  5.  
  6.  while(strcmp(listaPalabras[posListaPalabras],"@fin@")!=0){
  7.  
  8.    printf("%s\n",listaPalabras[posListaPalabras]);   //imprime mal....
  9.    posListaPalabras++;
  10.  
  11.  }
  12.  

¿porque el printf() del bucle while() no me imprime lo mismo que los printf() de la funcion cargaListaPalabras()?

Gracias por las respuestas.


« Última modificación: 19 Octubre 2015, 06:22 am por soyloqbuskas » En línea

"Si tienes 1 manzana y yo tengo otra manzana...
y las intercambiamos, ambos seguiremos teniendo 1 manzana.
Pero...si tu tienes 1 idea y yo tengo otra idea...
y las intercambiamos, ambos tendremos 2 ideas."


George Bernard Shaw
Seyro97

Desconectado Desconectado

Mensajes: 145


Ver Perfil WWW
Re: Problemas con printf();
« Respuesta #1 en: 19 Octubre 2015, 05:53 am »

Tendrías que poner en vez de 'char palabra[100]="";', 'static char palabra[100]="";'


En línea

Carlos Peláez González. visita http://www.taringa.net/EnjoyC para muchos tutoriales!
do-while


Desconectado Desconectado

Mensajes: 1.276


¿Habra que sacarla de paseo?


Ver Perfil
Re: Problemas con printf();
« Respuesta #2 en: 19 Octubre 2015, 11:58 am »

¡Buenas!

Aunque declares la variable palabra como static no vas a conseguir que listaPalabras contenga ningún dato últil fuera de la funcion. Tu error está en la línea de código 19:
Código
  1. listaPalabras[posListaPalabras]=palabra;
  2.  

Lo que estás haciendo con esta sentencia es asignar la dirección de memoria de palabra a una de las palabras que quieres almacenar en la lista (es una asignación entre punteros), es decir, todas las palabras están apuntando a la misma variable. Si quieres almacenar el contenido de la cadena y no su dirección de memoria tienes dos opciones:

1. Asignar una longitud de forma estática a cada elemento de listaPalabras en el momento en el que la declaras.
2. Si no has hecho lo anterior listaPalabras solo será un vector de punteros, así que tendrás que asignar la memoria necesaria para almacenar la cadena de caracteres de forma dinámica dentro de propia función cargarListaPalabras.

Una vez que sepamos que cada una de los elementos de listaPalabras tiene memoria suficiente para almacenar las cadenas tendrás que hacer un strcpy o strncpy (si has declarado la cantidad de memoria de cada una de las cadenas en el momento de la declaración te recomiendo ésta segunda función para asegurarte de que no vas a sobrepasar el límite establecido) para almacenar el contenido de la variable palabra en la posición que corresponda dentro de listaPalabras.

Si vas a asignar la memoria dinámicamente asegurate de liberarla antes de que la variable que corresponde se con listaPalabras en la lista de parámetros salga de su ámbito.

¡Saludos!

Por cierto, cometes el mismo error en las líneas 30 y 36.

¡Saludos!
« Última modificación: 19 Octubre 2015, 12:01 pm por do-while » En línea

- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!
soyloqbuskas

Desconectado Desconectado

Mensajes: 218


¡El conocimiento es de todos!


Ver Perfil
Re: Problemas con printf();
« Respuesta #3 en: 20 Octubre 2015, 00:22 am »

Gracias por la ayuda, pero no me funciona...incluso lo del strcpy...

probe a sustituir:
Citar
listaPalabras[posListaPalabras]=palabra;
por esto:
Citar
strncpy(listaPalabras[posListaPalabras],palabra,strlen(palabra));

Y esto compila de maravilla pero cuando ejecuto el programa me da fallo de segmentacion...

listaPalabras la tengo declarada asi: char* listaPalabras[1000000];
y palabra la tengo declarada asi: char palabra[100]="";

He probado a inicializar listaPalabras con un bucle:
Código
  1. for(i=0;i<longListaPalabras;i++) { listaPalabras[i]=""; }
  y compila pero tampoco funciona....

no se porque strncpy() me da fallo de segmentacion...¿Alguna idea?
« Última modificación: 20 Octubre 2015, 00:47 am por soyloqbuskas » En línea

"Si tienes 1 manzana y yo tengo otra manzana...
y las intercambiamos, ambos seguiremos teniendo 1 manzana.
Pero...si tu tienes 1 idea y yo tengo otra idea...
y las intercambiamos, ambos tendremos 2 ideas."


George Bernard Shaw
soyloqbuskas

Desconectado Desconectado

Mensajes: 218


¡El conocimiento es de todos!


Ver Perfil
Re: Problemas con printf();
« Respuesta #4 en: 20 Octubre 2015, 00:57 am »

vaaaaaleeee!!! ya di con la solucion. Tenia que utilizar el strncpy() e inicializar listaPalabras con un calloc()

forma correcta de inicializarlo:
Código
  1. for(i=0;i<longListaPalabras;i++) { listaPalabras[i]=(char*)calloc(100,1); }

muchas gracias a todos por la ayuda!
« Última modificación: 20 Octubre 2015, 01:13 am por soyloqbuskas » En línea

"Si tienes 1 manzana y yo tengo otra manzana...
y las intercambiamos, ambos seguiremos teniendo 1 manzana.
Pero...si tu tienes 1 idea y yo tengo otra idea...
y las intercambiamos, ambos tendremos 2 ideas."


George Bernard Shaw
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Problemas con las funciones printf y exit en Dev C++ « 1 2 »
Programación C/C++
kichan 10 22,705 Último mensaje 16 Abril 2012, 21:31 pm
por urielseptim007
printf() Problemas con el formato
Java
KuraraGNU 8 5,254 Último mensaje 3 Diciembre 2010, 06:40 am
por 1mpuls0
getc() y printf
Programación C/C++
m@o_614 1 1,861 Último mensaje 12 Septiembre 2013, 23:44 pm
por ecfisa
Curiosidad con printf en C
Programación C/C++
milx86 2 1,751 Último mensaje 11 Octubre 2014, 20:46 pm
por milx86
No me ejecuta el printf
Programación C/C++
GonzaJava 5 3,126 Último mensaje 13 Abril 2018, 18:39 pm
por GonzaJava
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines