Autor
|
Tema: [C][?] No se ejecutan printf (Leído 3,451 veces)
|
JoseluCross
Desconectado
Mensajes: 33
Conoceréis la Verdad, y la Verdad os hará libres
|
Tengo un problema la mar de raro. Pase lo que pase nunca imprime el texto "prueba", si meto un valor incorrecto si se ejecuta el printf("El número %d%c no es válido\n",n,c) El código es int main() { int n; //Número que añadiremos char c; //Carácter de control bool control = false; //Variable para el control de entrada
do { printf("Introduce un número en base decimal: "); if(scanf("%d%c", &n, &c) != 2 || c != '\n') { printf("El número %d%c no es válido\n", n, c); clean_stdin(); control = false; } else { printf("prueba"); if(n >= 0) { printf("El binario de %d es: ", n); cambioBinario(n); control = true; } } } while(control == false || n < 0);
return 0; } Muchas gracias de antemano
|
|
|
En línea
|
No hay problema sin solución, solo personas que no quieren resolverlo.
|
|
|
class_OpenGL
Desconectado
Mensajes: 437
Si usas Direct3D, no eres mi amigo :P
|
Fíjate en una cosa. ¿Qué tiene que pasar para que el if diga que es falsa la condición? O bien que no haya leido los datos suficientes, o bien que el carácter que haya leido sea igual a '\n'. Entonces, se tendrían que dejar de cumplir esas dos condiciones. Para que falle la primera, podríamos introducir un "hola\n" (evidentemente "hola\n" no es un número natural), pero al haber introducido un "hola\n" y haber fallado al traducirlo a número, ese "hola\n" se ha quedado guardado en un búfer esperando a que sea leido. Entonces, una vez fallada la lectura del número natural, se procede a leer el carácter. El primer carácter disponible es la 'h'. Entonces, después de la lectura el entero vale 0 y la variable de tipo carácter vale 'h'. Entonces, como ves, el carácter es distinto de '\n', y por tanto nunca esa condición se va a cumplir.
|
|
|
En línea
|
| Programador aficionado. Me quiero centrar en programar videojuegos. La API que uso para crearlos es OpenGL |
|
|
|
|
MAFUS
Desconectado
Mensajes: 1.603
|
A mi me funciona el código.
A decir verdad me he inventado código para las funciones que no muestras, a lo mejor el problema está allí.
¿Porqué no muestras el código entero, #includes incluidos?
Por cierto, para escribir mensajes de error o cadenas de control para depurar el programa mejor hacerlo con fprintf(stderr, cadena_mensaje_error, ...);
La razón es que la escritura a stderr se muestra directamente por pantalla o donde sea que apunte stderr, mientras que si se escribe a stdout el mensaje se guarda en búffer y C lo libera cuándo cree conveniente. Y eso es la razón de la existencia de fflush(descriptor_del_flujo_de_salida), para forzar que se libere el buffer de forma inmediata.
|
|
« Última modificación: 23 Marzo 2016, 18:56 pm por MAFUS »
|
En línea
|
|
|
|
JoseluCross
Desconectado
Mensajes: 33
Conoceréis la Verdad, y la Verdad os hará libres
|
El código completo es /*Título: Ejercicio 2 *Descripción: Calcula el cambio a base decimal, octal y hexadecimal *Autor: José Luis Garrido Labrador (JoseluCross) *Version: 1.0 - mar/16 */
#include <stdio.h> #include <stdbool.h> #include <math.h>
int clean_stdin(void); void cambioBinario(int); void imprimeResultado(int);
int main() { int n; //Número que añadiremos char c; //Carácter de control bool control = false; //Variable para el control de entrada
do { printf("Introduce un número en base decimal: "); if(scanf("%d%c", &n, &c) != 2 || c != '\n') { printf("El número %d%c no es válido\n", n, c); clean_stdin(); control = false; } else { printf("prueba"); if(n >= 0) { printf("El binario de %d es: ", n); cambioBinario(n); //cambioOctal(decimal); //cambioHex(decimal); control = true; } } } while(control == false || n < 0);
return 0; }
//Función para la limpieza del buffer del teclado int clean_stdin() { while(getchar() != '\n') ; return 1; }
/* *Nombre: cambioBinario *Descripción: Convierte un número decimal a binario *@param n: número que convertiremos *@author: JoseluCross */ void cambioBinario(int n) { int x = 1; //Variable de longitud //Asignamos tamaño de cifras que tendrá el número en binario for(x = 1; pow(2,x) > n; x++) ; int tam[x]; //El vector donde almacenaremos las cifras (para este procedimiento no se usará recursividad) int p = 0; //Variable de posición //Bucle para la asignación de cifras binarias for(p = 0; p = x; p++) { tam[p] = n % 2; n = n / 2; } //Bucle para el envío a imprimir for(p = x; p = 0; p--) { imprimeResultado(tam[p]); } printf("\n"); }
/* *Nombre: imprimeResultado *Descripción: imprime el resultado de cada cambio *@param a: valor que se imprimirá *@author: JoseluCross */ void imprimeResultado(int a) { printf("%d", a); }
|
|
|
En línea
|
No hay problema sin solución, solo personas que no quieren resolverlo.
|
|
|
MAFUS
Desconectado
Mensajes: 1.603
|
Fallos en tu código: Línea 60 for(p = 0; p = x; p++)
Línea 65 for(p = x; p = 0; p--)
Estos fors están mal formulados, como puedes ver donde debe haber la comparación hay una asignación. Por cierto, haciendo uso de operadores adecuados, como el de desplazamientos de bits y evitando funciones redundantes como la imprimeResultado y clean_stdin puedes reducir el tamaño del código menos de la mitad.
|
|
|
En línea
|
|
|
|
JoseluCross
Desconectado
Mensajes: 33
Conoceréis la Verdad, y la Verdad os hará libres
|
Muchas gracias, era ese el problema. Gracias también por el consejo.
|
|
|
En línea
|
No hay problema sin solución, solo personas que no quieren resolverlo.
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
SDL mixer + SDL ttf; No se ejecutan
Programación C/C++
|
Puntoinfinito
|
0
|
1,637
|
20 Enero 2013, 13:47 pm
por Puntoinfinito
|
|
|
No se me ejecutan los alias
GNU/Linux
|
danny920825
|
7
|
3,366
|
4 Junio 2015, 00:55 am
por MinusFour
|
|
|
[Ayuda]: ¿Por qué MouseOver & MouseOut no ejecutan la función?
Desarrollo Web
|
Miguelcarp14
|
1
|
2,222
|
11 Febrero 2018, 01:44 am
por engel lex
|
|
|
No me ejecuta el printf
Programación C/C++
|
GonzaJava
|
5
|
3,504
|
13 Abril 2018, 18:39 pm
por GonzaJava
|
|
|
Implementación de printf no termina con null las cadenas
Programación C/C++
|
huchoko
|
8
|
2,933
|
8 Abril 2019, 03:29 am
por huchoko
|
|