Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: criskapunk en 28 Junio 2011, 20:02 pm



Título: [Solucionado] ¿La funcion scanf() permite escribir?
Publicado por: criskapunk en 28 Junio 2011, 20:02 pm
Buenas!

scanf() permite imprimir una string? Tengo el siguiente codigo:

Código
  1. #include <stdio.h>
  2.  
  3. main()
  4. {
  5. /* Ingresa un numero de 4 digitos de la forma XXXX y lo devuelve como X X X X */
  6.  
  7. int num;
  8.  
  9. printf("Ingrese un numero de cuatro digitos:\n");
  10. scanf("%d", &num);
  11. printf("%d %d %d %d", num / 1000, (num / 100) % 10, (num / 10) % 10, num % 10);
  12.  
  13. return 0;
  14. }

Lo que hace es pedir un numero, ejemplo 1234 y devolverlo de la forma 1 2 3 4.

Cambie el codigo y probe con esta linea:

Código
  1. scanf("Ingrese un numero de cuatro digitos: %d", %num);

Cuando lo ejecuto no me aparece el mensaje y si ingreso, por ejemplo, el numero 1234 me devuelve 4202 5 0 0. No es posible imprimir texto con esta funcion? (Lo pregunto porque creo haber leido en un libro que descargue hace poco). Si no es posible, no deberia dar error de sintaxis?

Un saludo y perdon por estas dudas tan basicas  :)


Título: Re: ¿La funcion scanf() permite escribir?
Publicado por: Oblivi0n en 28 Junio 2011, 20:18 pm
La funcion scanf es la funcion de entrada de caracteres, para imprimir caracteres tienes printf (entre otras)


Título: Re: ¿La funcion scanf() permite escribir?
Publicado por: criskapunk en 28 Junio 2011, 20:26 pm
Si, ya se que para imprimir tengo la funcion printf(), pero tengo la duda de porque si intento escribir texto con scanf() me devuelve esos valores. No deberia darme algun error y ni siquiera compilar?

Un saludo :)


Título: Re: ¿La funcion scanf() permite escribir?
Publicado por: leogtz en 28 Junio 2011, 21:30 pm
scanf() espera una entrada con formato, así que scanf() espera que exactamente le des la entrada:
Código:
Ingrese un numero de cuatro digitos: %d
seguida de un número, mira:

Código
  1. #include <stdio.h>
  2. int main(void)
  3. {
  4.    int valor;
  5.    scanf("Hola mundo %d", &valor);
  6.    printf("%d\n", valor);
  7.    return 0;
  8. }
  9.  


Código:
┌─[0 leo@leo-945GCT-M ~/Escritorio]$
└─> ./code
Hola mundo 6512
6512
┌─[0 leo@leo-945GCT-M ~/Escritorio]$
└─>


Código:
┌─[130 leo@leo-945GCT-M ~/Escritorio]$
└─> ./code
lalalala 123
12849140
┌─[0 leo@leo-945GCT-M ~/Escritorio]$
└─>


Título: Re: ¿La funcion scanf() permite escribir?
Publicado por: Acermax en 28 Junio 2011, 21:31 pm
scanf espera de primer argumento un string, para poner por ejemplo "%d". Tu realmente le estás pasando un string así que "no haces nada mal" en la llamada a la función.

El problema es que no le pasas lo que espera, que es %d,%s,%x etc... así que te da un resultado aleatorio.

Imagino que es así, ya que yo nunca he trabajado con estas funciones, yo siempre fuí de c++.

EDIT: A la vez que publicaba esto escribía Leo, que seguro que sabe mejor que yo como funciona esta función.


Título: Re: ¿La funcion scanf() permite escribir?
Publicado por: criskapunk en 29 Junio 2011, 02:26 am
@Leo

No entiendo tu ultimo codigo. Devuelve eso cuando pones caracteres a imprimir dentro del primer argumento de scanf?


Título: Re: ¿La funcion scanf() permite escribir?
Publicado por: leogtz en 29 Junio 2011, 02:31 am
Lo que pasa es que al poner
Código
  1. scanf("Hola mundo %d", &valor);
Estás diciendo que forzosamente debe de haber la cadena "Hola mundo " antes del número, sino no se asignará correctamente en valor.

Mira la siguiente salida:

Código:
┌─[0 leo@leo-945GCT-M ~/Escritorio]$
└─> ./args
Hola mundo 123
123
┌─[0 leo@leo-945GCT-M ~/Escritorio]$
└─> ./args
Hola mundoo 123
15949812
┌─[0 leo@leo-945GCT-M ~/Escritorio]$
└─> ./args
123
2543604
┌─[0 leo@leo-945GCT-M ~/Escritorio]$
└─> ./args
hola mundo 123
2785268
┌─[0 leo@leo-945GCT-M ~/Escritorio]$
└─> ./args
Hola mundo
123
123
┌─[0 leo@leo-945GCT-M ~/Escritorio]$
└─>

Fijate que solo se asigna correctamente cuando ponemos "Hola mundo " seguido de un número.


Título: Re: ¿La funcion scanf() permite escribir?
Publicado por: criskapunk en 29 Junio 2011, 02:35 am
Entonces cuando ponemos caracteres que no sean los especificadores de formato dentro del primer argumento del scanf() estamos obligando a que el usuario escriba esa cadena y a continuacion el entero?



Título: Re: ¿La funcion scanf() permite escribir?
Publicado por: leogtz en 29 Junio 2011, 02:52 am
Así es, puedes usar "especificadores de formato", mira un ejemplo:
Código
  1. #include <stdio.h>
  2. int main(void)
  3. {
  4. int valor;
  5. scanf("%*s %d", &valor);
  6. printf("[%d]\n", valor);
  7. return 0;
  8. }
  9.  

Esto me permite ingresas cosas como:

Código:
┌─[0 leo@leo-945GCT-M ~/Escritorio]$
└─> ./code
foro.elhacker.net 5
[5]
┌─[0 leo@leo-945GCT-M ~/Escritorio]$
└─> ./code
Holaaaaaaaaaaaaaaaaaaaaaaaaaaaa!!!!!!!!!!!! 123
[123]


Título: Re: ¿La funcion scanf() permite escribir?
Publicado por: criskapunk en 29 Junio 2011, 02:59 am
Muchas gracias por las respuestas. Ya esta solucionado :)

Un saludo