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
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.
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.
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);
}
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.
Muchas gracias, era ese el problema. Gracias también por el consejo.