Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: JoseluCross en 23 Marzo 2016, 13:55 pm



Título: [C][?] No se ejecutan printf
Publicado por: JoseluCross en 23 Marzo 2016, 13:55 pm
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
Código:
printf("El número %d%c no es válido\n",n,c)
El código es
Código:
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


Título: Re: [C][?] No se ejecutan printf
Publicado por: class_OpenGL en 23 Marzo 2016, 15:24 pm
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.


Título: Re: [C][?] No se ejecutan printf
Publicado por: MAFUS en 23 Marzo 2016, 18:04 pm
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.


Título: Re: [C][?] No se ejecutan printf
Publicado por: JoseluCross en 23 Marzo 2016, 19:55 pm
El código completo es
Código:
/*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);
}


Título: Re: [C][?] No se ejecutan printf
Publicado por: MAFUS en 23 Marzo 2016, 22:34 pm
Fallos en tu código:
Línea 60
Código
  1. for(p = 0; p = x; p++)
Línea 65
Código
  1. 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.


Título: Re: [C][?] No se ejecutan printf
Publicado por: JoseluCross en 25 Marzo 2016, 15:07 pm
Muchas gracias, era ese el problema. Gracias también por el consejo.