Ver Mensaje Individual
  #7 (permalink)  
Antiguo 09/09/2013, 05:38
Avatar de L3m0n
L3m0n
 
Fecha de Ingreso: diciembre-2011
Mensajes: 219
Antigüedad: 12 años, 10 meses
Puntos: 46
Respuesta: No entiendo poruqe pasa esto

Bueno, este digamos que es el tipico problema que afronta todo programador de C cuando empieza y se da de golpes contra el input/output de C xD

Las soluciones de los otros compañeros son buenas y funcionan, pero yo quiero aportar otra solucion, ya que creo que es mas "correcta". Se trata de en vez de tratar de hacer hacks para que la funcion scanf funcione como queramos, usar funciones que funcionan bien, sin necesitad de hacer ningun truco extraño.

Estas dos funciones son por un lado fgets, que nos permite leer una cadena de un fichero, o en este caso del stdin, es decir del input del usuario y la otra sscanf, sí, con dos 's'. Esta función nos permite transformar la cadena que obtenemos en este caso a un entero.

Así que un ejemplo de lectura sería:
Código C:
Ver original
  1. ...
  2. char cad[10];
  3. int a;
  4. fgets(cad,sizeof(cad),stdin);
  5. sscanf(cad,"%d",&a);

Y así tendriamos el número que el usuario ha entrado en la variable a.

Pero si eres un buen programador vago como deben ser los programadores dirás: Y cada vez que quiera leer un numero tengo que hacer eso, buf que palo...

Aquí es donde entra en juego hacer una función propia, aquí tienes dos opciones, que són más que nada estéticas dependiendo de si quieres leer los números así:
(nuestra función se llamará myscanf())
Código C:
Ver original
  1. int a = myscanf();
o como la scanf normal, es decir así:
Código C:
Ver original
  1. int a;
  2. myscanf("%d",&a);

Así que ahora procedo a poner las dos funciones, que simplemente tienes que poner en tu código y llamar cuando quieras obtener un valor numerico:
myscanf1, esta es la que no requiere ningun parámetro y devuelve un entero:
Código C:
Ver original
  1. int myscanf()
  2. {
  3.     char cad[10];
  4.     int a;
  5.     fgets(cad,sizeof(cad),stdin);
  6.     sscanf(cad,"%d",&a);
  7.    
  8.     return a;
  9. }

Por otro lado, si lo que quieres es usar esta función como si fuera la propia scanf, usa esta función:
Código C:
Ver original
  1. void myscanf2(char *a, int *b)
  2. {
  3.     char cad[10];
  4.     fgets(cad,sizeof(cad),stdin);
  5.     sscanf(cad,a,b);
  6. }

Bueno, si tienes alguna duda con alguna de las funciones, no dudes en preguntar :)

Última edición por L3m0n; 09/09/2013 a las 05:45