[C][?] No se ejecutan printf

Iniciado por JoseluCross, 23 Marzo 2016, 13:55 PM

0 Miembros y 2 Visitantes están viendo este tema.

JoseluCross

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
No hay problema sin solución, solo personas que no quieren resolverlo.

class_OpenGL

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.

Programador aficionado. Me quiero centrar en programar videojuegos. La API que uso para crearlos es OpenGL

MAFUS

#2
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.

JoseluCross

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);
}

No hay problema sin solución, solo personas que no quieren resolverlo.

MAFUS

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.

JoseluCross

Muchas gracias, era ese el problema. Gracias también por el consejo.
No hay problema sin solución, solo personas que no quieren resolverlo.