Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Problema con printf en C

Estas en el tema de Problema con printf en C en el foro de C/C++ en Foros del Web. Hola a todos tengo el siguiente codigo: @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código C: Ver original #include <stdio.h>   void menu ( ) ; int db ( char ...
  #1 (permalink)  
Antiguo 25/07/2014, 23:02
 
Fecha de Ingreso: febrero-2014
Mensajes: 107
Antigüedad: 10 años, 1 mes
Puntos: 0
Exclamación Problema con printf en C

Hola a todos tengo el siguiente codigo:
Código C:
Ver original
  1. #include <stdio.h>
  2.  
  3. void menu();
  4. int db(char[]);
  5. int dh();
  6. int bd();
  7. int bh();
  8. int hd();
  9. int hb();
  10.  
  11. int main(){
  12. int num,opc;
  13. char numero[20];
  14.  
  15. printf("Digite el numero: ");
  16. scanf("%20s",&numero);
  17. menu();
  18. printf("\nEscoja una opcion de conversion: \n \n");
  19. scanf("%d",&opc);
  20.     switch(opc){
  21.         case 1: db(numero);break;
  22.         case 2: dh();break;
  23.         case 3: bd();break;
  24.         case 4: bh();break;
  25.         case 5: hd();break;
  26.         case 6: hb();break;
  27.         default: printf("No existe esta opcion.");
  28.     }
  29.  
  30.  
  31. }
  32.  
  33. void menu (){
  34.     printf("1- Decimal a Binario (db)\n");
  35.     printf("2- Decimal a Hexadecimal (dh)\n");
  36.     printf("3- Binario a Decimal (bd)\n");
  37.     printf("4- Binario a Hexadecimal (bh)\n");
  38.     printf("5- Hexadecimal a Decimal (hd)\n");
  39.     printf("6- Hexadecimal a Binario (hb)\n");
  40.  
  41. }
  42.  
  43. int db(char nume[20]){
  44.     char *asd;
  45.     asd=nume;
  46.     int pos,fin,res=0,calc=0,aa=1;
  47.  
  48.     for(int i=19; i>=0;i--){
  49.         if(asd[i]>=48 && asd[i]<=57){
  50.             pos=i;
  51.             break;
  52.         }
  53.     }
  54.  
  55.     for(int i=19; i>=0;i--){
  56.         if(asd[i]>=48 && asd[i]<=57){
  57.             fin=i;
  58.         }
  59.     }
  60.  
  61.     if(fin==0){
  62.         for(int i=pos;i>=0;i--){
  63.             calc=asd[i]-48;
  64.             //printf("%d\n",calc);
  65.             res=res+calc*aa;
  66.             aa=aa*10;
  67.         }
  68.     }else{printf("Numero no valido");return 0;}
  69.  
  70.     printf("\n%d\n\n",res);
  71.  
  72.     if(res>=0){
  73.         calc=res%2;
  74.         res=res/2;
  75.         asd[0]=calc+48;
  76.         int j=1;
  77.         //printf("%d",res);
  78.         while(res>=2){
  79.             //printf("%d",res);
  80.             calc=res%2;
  81.             res=res/2;
  82.             asd[j]=calc+48;
  83.             pos=j;
  84.             j++;
  85.  
  86.         }
  87.     }
  88.  
  89.     //printf("\n\n%d",pos);
  90.  
  91.  
  92.     return 0;
  93. }
  94.  
  95. int dh(){}
  96. int bd(){}
  97. int bh(){}
  98. int hd(){}
  99. int hb(){}

El problema es que en la linea 77 tengo un printf entre comentarios, imprimiendo la variable res igual que en la linea 70, el problema es que cuando quito los comentarios en la linea 77, me imprime unos numeros raros tanto en la linea 70 como en la linea 77; pero si dejo la linea 77 en comentarios me imprime el numero correctamente, que es el que uno digita por pantalla.
  #2 (permalink)  
Antiguo 26/07/2014, 02:27
Avatar de leosansan  
Fecha de Ingreso: mayo-2012
Ubicación: GRAN CANARIA
Mensajes: 194
Antigüedad: 11 años, 10 meses
Puntos: 49
Respuesta: Problema con printf en C

Cita:
Iniciado por shikamarucb Ver Mensaje
.............................
El problema es que en la linea 77 tengo un printf entre comentarios, imprimiendo la variable res igual que en la linea 70, el problema es que cuando quito los comentarios en la linea 77, me imprime unos numeros raros tanto en la linea 70 como en la linea 77; pero si dejo la linea 77 en comentarios me imprime el numero correctamente, que es el que uno digita por pantalla.
Eso es porque al no usar '\n' en los printf salen los valores de "res" uno a continuación de otro.

De todas formas veo un poco caótico el método para pasar a binario. Sin modificarte lo mucho, poco más que los nombres de las variables:

Código C++:
Ver original
  1. int db ( char numDecimal [ 20 ] ) {
  2.  
  3.     int i , lon , factor = 1 , num = 0 , num0 ;
  4.  
  5.   /*------> Calculo tamaño real de "numDecimal" <------*/
  6.  
  7.     for ( lon = 0 ; numDecimal[ lon ] ; lon++ ) ;
  8.  
  9.   /*-------> Paso "numDecimal"  a int en "num "<-------*/
  10.  
  11.     for( i = lon - 1 ; i >= 0 ; i-- , factor *= 10 ) {
  12.       if( numDecimal[ i ] < 48 || numDecimal[ i ] > 57 ) {
  13.         puts( "Numero no valido" ) ;
  14.         return 0 ;
  15.       }
  16.       num += ( numDecimal [ i ] - 48 ) * factor ;
  17.     }
  18.     num0 = num ;
  19.  
  20.   /*--> Calculo tamaño real de "numBinario" = num en binario <--*/
  21.  
  22.     for ( lon = 0 ; num0 >= 1 ; lon++ , num0 /= 2 ) ;
  23.     char numBinario [ lon ] ;
  24.  
  25.   /*-------> Paso "num"  a binario en "numBinario "<-------*/
  26.  
  27.     for( i = lon - 1  ; num ;  i-- , num /= 2 )
  28.       numBinario [ i ] = ( num % 2) + 48 ;
  29.      
  30.     numBinario [ lon ] = '\0' ;
  31.    
  32.     printf("\n\n%s\n\n",numBinario);
  33.     return 0;
  34. }

¡¡¡Saluditos!!!

  #3 (permalink)  
Antiguo 26/07/2014, 11:05
 
Fecha de Ingreso: febrero-2014
Mensajes: 107
Antigüedad: 10 años, 1 mes
Puntos: 0
Respuesta: Problema con printf en C

Cita:
Iniciado por leosansan Ver Mensaje
Eso es porque al no usar '\n' en los printf salen los valores de "res" uno a continuación de otro.
No man y porque van a salir tantos valores si nisiquiera estan dentro en bucle, examina bien el codigo y lo veras, tendria que salir el valor del numero que uno digito, y en la otra impresion por pantalla la division entera de res
  #4 (permalink)  
Antiguo 26/07/2014, 11:34
Avatar de leosansan  
Fecha de Ingreso: mayo-2012
Ubicación: GRAN CANARIA
Mensajes: 194
Antigüedad: 11 años, 10 meses
Puntos: 49
Respuesta: Problema con printf en C

Cita:
Iniciado por shikamarucb Ver Mensaje
No man y porque van a salir tantos valores si nisiquiera estan dentro en bucle, examina bien el codigo y lo veras, tendria que salir el valor del numero que uno digito, y en la otra impresion por pantalla la division entera de res
Pues sí man, va a ser que no has puesto el '\n' en los printf de las líneas 77 y 79.

Si los activas y pones algo como esto:

Código C++:
Ver original
  1. }else{printf("Numero no valido");return 0;}
  2.  
  3.     printf("\nLINEA 70::%d\n\n",res);
  4.  
  5.     if(res>=0){
  6.         calc=res%2;
  7.         res=res/2;
  8.         asd[0]=calc+48;
  9.         int j=1;
  10.         printf("LINEA 77::%d",res);
  11.         while(res>=2){
  12.             printf("::LINEA 79::%d",res);
  13.             calc=res%2;
  14.             res=res/2;
  15.             asd[j]=calc+48;
  16.             pos=j;
  17.             j++;
  18.         }

La salida que obtienes es:

Código C++:
Ver original
  1. Digite el numero: 1234
  2.  
  3. LINEA 70::1234
  4.  
  5. LINEA 77::617::LINEA 79::617::LINEA 79::308::LINEA 79::154::LINEA 79::77::LINEA
  6. 79::38::LINEA 79::19::LINEA 79::9::LINEA 79::4::LINEA 79::2
  7. Process returned 0 (0x0)   execution time : 3.330 s
  8. Press any key to continue.

Y como ves al no poner el mencionado '\n' te salen "pegados" los printf de las líneas 77 y 79. Si observas bien, el primer valor es 617 = 1234 / 2 de la línea 77 y a continuación, y "pegaditos" , los de la línea 79 que son varios por el while.

¡¡¡Saluditos!!!

  #5 (permalink)  
Antiguo 26/07/2014, 12:38
 
Fecha de Ingreso: febrero-2014
Mensajes: 107
Antigüedad: 10 años, 1 mes
Puntos: 0
Respuesta: Problema con printf en C

Cita:
Iniciado por leosansan Ver Mensaje

Y como ves al no poner el mencionado '\n' te salen "pegados" los printf de las líneas 77 y 79. Si observas bien, el primer valor es 617 = 1234 / 2 de la línea 77 y a continuación, y "pegaditos" , los de la línea 79 que son varios por el while.
Joder man mira bien el codigo que te puse, la linea 79 esta en comentarios; yo solo te menciones la linea 70 y 77; por eso digo que me deberian salir 2 numeros el que yo digito por la pantalla y el de la division entera; el que esta dentro del while esta en COMENTARIOS.
  #6 (permalink)  
Antiguo 26/07/2014, 12:53
Avatar de leosansan  
Fecha de Ingreso: mayo-2012
Ubicación: GRAN CANARIA
Mensajes: 194
Antigüedad: 11 años, 10 meses
Puntos: 49
Respuesta: Problema con printf en C

Cita:
Iniciado por shikamarucb Ver Mensaje
Joder man mira bien el codigo que te puse, la linea 79 esta en comentarios; yo solo te menciones la linea 70 y 77; por eso digo que me deberian salir 2 numeros el que yo digito por la pantalla y el de la division entera; el que esta dentro del while esta en COMENTARIOS.
Y salen dos números, basta desactivar la 79 para obtener la siguiente salida:

Código C++:
Ver original
  1. Digite el numero: 1234
  2.  
  3. LINEA 70::1234
  4.  
  5. LINEA 77::617
  6. Process returned 0 (0x0)

Que se corresponden con el número ingresado y el resultado de dividir por 2. ¿Es que esperabas otra cosa?.

¡¡¡Saluditos!!!

  #7 (permalink)  
Antiguo 26/07/2014, 15:13
 
Fecha de Ingreso: febrero-2014
Mensajes: 107
Antigüedad: 10 años, 1 mes
Puntos: 0
Respuesta: Problema con printf en C

Cita:
Iniciado por leosansan Ver Mensaje

Que se corresponden con el número ingresado y el resultado de dividir por 2. ¿Es que esperabas otra cosa?.
Cita:
Iniciado por shikamarucb Ver Mensaje

El problema es que en la linea 77 tengo un printf entre comentarios, imprimiendo la variable res igual que en la linea 70, el problema es que cuando quito los comentarios en la linea 77, me imprime unos numeros raros tanto en la linea 70 como en la linea 77; pero si dejo la linea 77 en comentarios me imprime el numero correctamente, que es el que uno digita por pantalla.
Man mira lo que escribi, me salen unos numeros raros; me sale -107511265 o algo similar se supone que deberia salir asi como tu dijiste, pero no...
  #8 (permalink)  
Antiguo 27/07/2014, 12:55
 
Fecha de Ingreso: junio-2008
Ubicación: Seattle, USA
Mensajes: 733
Antigüedad: 15 años, 10 meses
Puntos: 61
Respuesta: Problema con printf en C

Algunos comentarios a tu programa

- La variable "fin" no es inicializada. Debes saber que en C, no se asegura un valor inicial para las variables locales, por lo que hacer if( fin == 0 ) sin haberle dado un valor inicial es incorrecto (o "peligroso", si quieres)

- Cuando controlas uno de tus ciclos con "pos", es posible que esa variable no haya sido inicializada pues su valor depende de algunas condiciones que no necesariamente se van a cumplir.

y, finalmente, una pregunta..

- Cambia algo el comportamiento de tu programa si en vez de leer numero usando

scanf( "%20s", &numero );

usaras

scanf( "%20s", numero ); // sin el &

?
__________________
Visita mi perfil en LinkedIn

Última edición por CalgaryCorpus; 27/07/2014 a las 14:11
  #9 (permalink)  
Antiguo 28/07/2014, 13:28
 
Fecha de Ingreso: febrero-2014
Mensajes: 107
Antigüedad: 10 años, 1 mes
Puntos: 0
Respuesta: Problema con printf en C

Cita:
Iniciado por CalgaryCorpus Ver Mensaje
Algunos comentarios a tu programa

- La variable "fin" no es inicializada. Debes saber que en C, no se asegura un valor inicial para las variables locales, por lo que hacer if( fin == 0 ) sin haberle dado un valor inicial es incorrecto (o "peligroso", si quieres)

- Cuando controlas uno de tus ciclos con "pos", es posible que esa variable no haya sido inicializada pues su valor depende de algunas condiciones que no necesariamente se van a cumplir.

y, finalmente, una pregunta..

- Cambia algo el comportamiento de tu programa si en vez de leer numero usando

scanf( "%20s", &numero );

usaras

scanf( "%20s", numero ); // sin el &

?
Hola man; al cambiar el scanf( "%20s", &numero ) por scanf( "%20s", numero ) no ha pasado nada y sigue igual; pero al inicializar la variable fin ya me imprime normal; pero quede como loco ; tu correccion es en cierta parte valida; si miras bien el for de donde depende el valor de la variable pos es igual al ciclo que de donde depende la variable fin, osea que si no hay un caracter entre 48 y 57 en el array ninguno de las dos variables va a ser "correcta", y por lo tanto seria un numero no valido y retornaria 0; pero digamos que al introducir un numero "valido" la variable fin ya tendria un valor igual 0 no deberia salir ese error.

Tambien queria preguntarte, el porque cambiaria el comportamiento del programa al usar un scanf sin el & .

De todos modos se arreglo el problema, pero tambien me quedaron dudas.. tambien descubri que hay un "errorsito" y es que al ingresar una cadena como: 52as23 la posicion seria la[5] y el fin seria [0] y eso lo tomaria como un numero valido y la posicion tambien seria valida.
  #10 (permalink)  
Antiguo 28/07/2014, 14:30
 
Fecha de Ingreso: junio-2008
Ubicación: Seattle, USA
Mensajes: 733
Antigüedad: 15 años, 10 meses
Puntos: 61
Respuesta: Problema con printf en C

Cuando una variable no es inicializada puede tener exactamente el valor que no esperas (o justo el que esperas). No es predecible. Es completamente posible que dentro de la casuística, tomando el caso que dices, por ejemplo, que no haya números validos, y por ello fin y pos nunca se inicializan, dentro de la "mala suerte", fin tiene un valor inicial 0 y pos tenga valor inicial 23042383, o aquel set de valores que hace que la logica que está a continuacion funcione de manera "extraña" o errática.

En otro asunto a mejorar, te sugiero usar algo que el compilador del lenguaje C provee GRATIS y que parece que no es muy conocido:
Cada vez que usas un caracter literal, el compilador REEMPLAZA ese caracter literal por el equivalente numerico.

Entonces, dado esto, es mucho mas legible un programa que dice

if( variable >= '0' && variable <= '9' )

que aquel que dice

if( variable >= 48 && variable <= 57 )

(suponiendo que esos son los valores)

si los valores son los correctos ambas instrucciones son equivalentes, pero una de ellas es, en mi opinion, mas clara que la otra.
Una consecuencia directa de esto es que no es necesario saber o averiguar a que codigo corresponde cada caracter. De hecho, es posible que se cometan errores al usar esas constantes, si es que uno se las supiera (mal). Mucho mejor usar '0', '1', etc.

Respecto al & es que no deberia existir diferencia entre &arr y arr, cuando arr es el identificador de un arreglo, pero si lo habrá cuando se trate de un puntero al comienzo de un arreglo y entonces mejor usar el puntero al inicio representado por el identificador del arreglo siempre. De otra manera, un compilador habil te dirá que podria haber un conflicto en esa particular construccion. Esto resulta medio jeroglífico, supongo que requiere que yo lo relea y rescriba otra vez, pero lo dejaré para una proxima oportunidad.
__________________
Visita mi perfil en LinkedIn

Última edición por CalgaryCorpus; 28/07/2014 a las 15:22
  #11 (permalink)  
Antiguo 28/07/2014, 15:22
 
Fecha de Ingreso: febrero-2014
Mensajes: 107
Antigüedad: 10 años, 1 mes
Puntos: 0
Respuesta: Problema con printf en C

Cita:
Iniciado por CalgaryCorpus Ver Mensaje
Cuando una variable no es inicializada puede tener exactamente el valor que no esperas (o justo el que esperas). No es predecible. Es completamente posible que dentro de la casuística, tomando el caso que dices, por ejemplo, que no haya números validos, y por ello fin y pos nunca se inicializan, dentro de la "mala suerte", fin tiene un valor inicial 0 y pos tenga valor inicial 23042383, o aquel set de valores que hace que la logica que está a continuacion funcione de manera "extraña" o errática.

En otro asunto a mejorar, te sugiero usar algo que el compilador del lenguaje C provee GRATIS y que parece que no es muy conocido:
Cada vez que usas un caracter literal, el compilador REEMPLAZA ese caracter literal por el equivalente numerico.

Entonces, dado esto, es mucho mas legible un programa que dice

if( variable >= '0' && variable <= '9' )

que aquel que dice

if( variable >= 48 && variable <= 57 )

(suponiendo que esos son los valores)

No es necesario sabérselos o averiguarlos. De hecho, es posible que se cometan errores al usar esas constantes. Mucho mejor usar '0', '1', etc.
Man pero siguen mis dudas, lo digo porque cuando inicie este tema la duda era que al mantener la linea 77 en comentarios el numero imprimia bien, pero al quitar los comentarios salia un numero raro tanto en linea 70 como en la 77; y como te digo se soluciono al inicializar la variable fin; pero vuelvo a lo mismo si se hubiera ingresado un numero valido tendria que imprimir tal cual y no imprimir numeros raros. Otra solucion que encontre fue pasar del CODE::BLOCKS a GEANY lo raro es que los dos usan MinGM claro que no de la misma version; es ahi donde me siento perdido que @#$$"#! tiene que ver simplemente en que yo ponga o quite la linea en comentarios para que me haga ese "bug" y que se solucione simplemente inicializando la varible suponiendo que los numeros ingresados eran validos. De todos formas voy a reinstalar CODE::BLOCKS y probar de nuevo haber si simplemente era una falla del compilador, ya que en GEANY me funciona normal.

En cuanto a los que dices de pasarlo como caracter literal y no su equivalente en ascii, ya lo sabia y tienes razon, solo que no hace mucho programaba con arduino y usaba su equivalente en ascii y pues se me quedo esa forma
  #12 (permalink)  
Antiguo 28/07/2014, 16:20
 
Fecha de Ingreso: junio-2008
Ubicación: Seattle, USA
Mensajes: 733
Antigüedad: 15 años, 10 meses
Puntos: 61
Respuesta: Problema con printf en C

Tengo una teoria para los numeros raros que ves:

El código que tienes chequea de "derecha a izquierda" (lineas 48 y 55) un arreglo (string) que se llena de izquierda a derecha. El arreglo es un string no inicializado, por lo que tiene basura que tu codigo visitador encuentra antes y produce los numeros raros.

Dicho de otro modo, el inicializar fin y pos es importante, pero no es suficiente para erradicar el problema que te hizo abrir este post.

Te propongo que, para hacerlo explícito, vuelvas a no tener inicializada las variables en cuestion (fin y res) y pongas en el main este cambio:

char numero[20];

cambiarla por

char numero[20] = { 0, 0, 0, 0, 0, 0, '3' };

podrias querer "defender" el programa diciendo, pero ¿y estos valores?

La idea detrás de esto es dejar explicito el contenido ("basura en la memoria") de esta variable no inicializada. Luego numero será leido por un scanf() posterior, ¿verdad?
Pon un numero pequeño (2 digitos, por ejemplo "15")

Mi sospecha es que tu codigo de visita de derecha a izquierda encontrará ese '3' primero y hará operatoria con esos valores.

Prueba poniendo menos 0 a la izquierda de ese '3' y verás aparecer distintos comportamientos dependiendo de esa cantidad.

Si vuelves "numero" a su definicion original (no inicializada), entonces el comportamiento de tu programa dependerá del contenido de la memoria de ese momento.

Solucion?
- Los ciclos para descubrir los digitos los tienes que hacer de "izquierda a derecha", no de "derecha a izquierda".
- "fin" y "pos" deben inicializarse
__________________
Visita mi perfil en LinkedIn

Última edición por CalgaryCorpus; 28/07/2014 a las 16:26
  #13 (permalink)  
Antiguo 28/07/2014, 21:20
 
Fecha de Ingreso: febrero-2014
Mensajes: 107
Antigüedad: 10 años, 1 mes
Puntos: 0
Respuesta: Problema con printf en C

Cita:
Iniciado por CalgaryCorpus Ver Mensaje
Tengo una teoria para los numeros raros que ves:

El código que tienes chequea de "derecha a izquierda" (lineas 48 y 55) un arreglo (string) que se llena de izquierda a derecha. El arreglo es un string no inicializado, por lo que tiene basura que tu codigo visitador encuentra antes y produce los numeros raros.

Dicho de otro modo, el inicializar fin y pos es importante, pero no es suficiente para erradicar el problema que te hizo abrir este post.

Te propongo que, para hacerlo explícito, vuelvas a no tener inicializada las variables en cuestion (fin y res) y pongas en el main este cambio:

char numero[20];

cambiarla por

char numero[20] = { 0, 0, 0, 0, 0, 0, '3' };

podrias querer "defender" el programa diciendo, pero ¿y estos valores?

La idea detrás de esto es dejar explicito el contenido ("basura en la memoria") de esta variable no inicializada. Luego numero será leido por un scanf() posterior, ¿verdad?
Pon un numero pequeño (2 digitos, por ejemplo "15")

Mi sospecha es que tu codigo de visita de derecha a izquierda encontrará ese '3' primero y hará operatoria con esos valores.

Prueba poniendo menos 0 a la izquierda de ese '3' y verás aparecer distintos comportamientos dependiendo de esa cantidad.

Si vuelves "numero" a su definicion original (no inicializada), entonces el comportamiento de tu programa dependerá del contenido de la memoria de ese momento.

Solucion?
- Los ciclos para descubrir los digitos los tienes que hacer de "izquierda a derecha", no de "derecha a izquierda".
- "fin" y "pos" deben inicializarse
Hola de nuevo, hombre lo ultimo que escribiste siendote sincero no lo entendi muy bien y te voy a decir que fue lo que te entendi:


con esto char numero[20] = { 0, 0, 0, 0, 0, 0, '3' }; tu pretendes explicarme como seria el funcionamiento de una variable no inicializada; que podria tener diferentes valores como por ejemplo '3' que seria un contenido basura, y al yo introducir digamos el 15 empezara a hacer los calculos desde la posicion del '3', pero al yo recorrer el array de izquierda a derecha entonces no me garantiza que en la posicion siguiente del 5 pueda aparecer un '3' que esto tambien seria algo valido.

Esto fue lo que te entendi man, no se si estoy en lo correcto; si esto es lo correcto entonces la solucion seria inicializar el array con algo que yo no vaya a usar como por ejemplo un @ o algo asi no?
  #14 (permalink)  
Antiguo 29/07/2014, 05:08
 
Fecha de Ingreso: junio-2008
Ubicación: Seattle, USA
Mensajes: 733
Antigüedad: 15 años, 10 meses
Puntos: 61
Respuesta: Problema con printf en C

Has comprendido bien, pero pruebalo!,
Luego, la solucion no es inicializar el arreglo, sino recorrerlo adecuadamente.
Las variables fin y pos sí requieren inicializacion.
__________________
Visita mi perfil en LinkedIn

Última edición por CalgaryCorpus; 29/07/2014 a las 05:29
  #15 (permalink)  
Antiguo 29/07/2014, 14:02
Avatar de leosansan  
Fecha de Ingreso: mayo-2012
Ubicación: GRAN CANARIA
Mensajes: 194
Antigüedad: 11 años, 10 meses
Puntos: 49
Respuesta: Problema con printf en C

Al no ser las variables de tipo "acumulador" o sumas, no veo problema en no iniciarlas, así como el array.

Sospecho como shikamarucb que tiene un problema en "su" Code::Blocks, el cual yo uso y con su mismo código no me da problema. Y como una imagen vale más que mil palabras:




¡¡¡Saluditos!!!

  #16 (permalink)  
Antiguo 29/07/2014, 14:29
 
Fecha de Ingreso: junio-2008
Ubicación: Seattle, USA
Mensajes: 733
Antigüedad: 15 años, 10 meses
Puntos: 61
Respuesta: Problema con printf en C

No corresponde echarle la culpa al compilador cuando el código está mal construido AUNQUE funcione en algunos casos.
De hecho, esta misma discusión se debe a que existe un comportamiento aparentemente errático, ¿no?

Si uno pudiera mirar la variable numero asi (por ejemplo si el usuario hubiera ingresado "57"

Código pseudo:
Ver original
  1. numero = | 5 | 7 | \0 | basura | basura | basura ... | ... | ultimo caracter

y quieres saber desde que posicion hasta que posicion revisar los numeros, TIENES que partir desde la izquierda

Código pseudo:
Ver original
  1. numero = | 5 | 7 | \0 | basura | basura | basura ... | ... | ultimo caracter
  2.          ------->

no desde la derecha

Código pseudo:
Ver original
  1. numero = | 5 | 7 | \0 | basura | basura | basura ... | ... | ultimo caracter
  2.                                                            <----------------

porque la basura que haya puede interferir en tu lógica.

Aquí da lo mismo la inicializacion de la variable numero, es el recorrido que se hace el problema.
Da lo mismo la inicializacion porque SIEMPRE se esta leyendo algo (con scanf), PERO scanf rellena a numero DE IZQUIERDA A DERECHA.
Leerlo en el otro sentido producirá problemas. Si no los produce es SUERTE (o mala suerte, depende del punto de vista)
__________________
Visita mi perfil en LinkedIn
  #17 (permalink)  
Antiguo 29/07/2014, 18:56
 
Fecha de Ingreso: febrero-2014
Mensajes: 107
Antigüedad: 10 años, 1 mes
Puntos: 0
De acuerdo Respuesta: Problema con printf en C

Cita:
Iniciado por CalgaryCorpus Ver Mensaje
No corresponde echarle la culpa al compilador cuando el código está mal construido AUNQUE funcione en algunos casos.
De hecho, esta misma discusión se debe a que existe un comportamiento aparentemente errático, ¿no?

Si uno pudiera mirar la variable numero asi (por ejemplo si el usuario hubiera ingresado "57"

Código pseudo:
Ver original
  1. numero = | 5 | 7 | \0 | basura | basura | basura ... | ... | ultimo caracter

y quieres saber desde que posicion hasta que posicion revisar los numeros, TIENES que partir desde la izquierda

Código pseudo:
Ver original
  1. numero = | 5 | 7 | \0 | basura | basura | basura ... | ... | ultimo caracter
  2.          ------->

no desde la derecha

Código pseudo:
Ver original
  1. numero = | 5 | 7 | \0 | basura | basura | basura ... | ... | ultimo caracter
  2.                                                            <----------------

porque la basura que haya puede interferir en tu lógica.

Aquí da lo mismo la inicializacion de la variable numero, es el recorrido que se hace el problema.
Da lo mismo la inicializacion porque SIEMPRE se esta leyendo algo (con scanf), PERO scanf rellena a numero DE IZQUIERDA A DERECHA.
Leerlo en el otro sentido producirá problemas. Si no los produce es SUERTE (o mala suerte, depende del punto de vista)
Joder ya por fin entendi y tienes toda la razon; yo empece a programar hace 6 meses y sinceramente yo no sabia que al final de una cadena habia un '\0' y hasta me da pena por eso yo creia que daba lo mismo recorrerlo en cualquier sentido y que los numeros basura podian ser todos como -188 pero lo comprobe con un FOR y si puede salir cualquier numero pero lo importante fue que me despejaste todas las dudas y que aprendi. Muchas gracias!!!
  #18 (permalink)  
Antiguo 29/07/2014, 19:44
 
Fecha de Ingreso: febrero-2014
Mensajes: 107
Antigüedad: 10 años, 1 mes
Puntos: 0
Respuesta: Problema con printf en C

Cita:
Iniciado por leosansan Ver Mensaje
Al no ser las variables de tipo "acumulador" o sumas, no veo problema en no iniciarlas, así como el array.
Hola man tu tambien tambien tienes razon pero si el array lo recorrieramos de izquierda a derecha porque me di cuenta que el codigo que publique esta llenito de errores; como dije antes si alguien digita algo asi como: 56ga32 la posicion de fin siempre sera la 0; en cambio lo que yo tenia pensado hacer ahora es recorrerlo de izquierda a derecha hasta que encuentre un '\0' y guardar la posicion en que se encuentra el ultimo caracter, y volverlo a recorrer pero hasta la posicion del ultimo caracter para verificar que todos los numeros esten entre 0 y 9. Creo entonces no hay necesidad de inicializarlas.

Etiquetas: printf
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 09:04.