2010-01-28 10 views
43

¿Cuál es el uso práctico de los formatos "%*" en scanf(). Si este formato existe, tiene que haber algún propósito detrás de él. El siguiente programa da salida extraña.¿Qué son los identificadores de formato scanf ("% * s") y scanf ("% * d")?

#include<stdio.h> 
int main() 
{ 
     int i; 
     char str[1024]; 

     printf("Enter text: "); 
     scanf("%*s", &str); 
     printf("%s\n", str); 

     printf("Enter interger: "); 
     scanf("%*d", &i); 
     printf("%d\n", i); 
     return 0; 
} 

Salida:

[email protected]:~$ gcc -Wall -pedantic d.c 
d.c: In function ‘main’: 
d.c:8: warning: too many arguments for format 
d.c:12: warning: too many arguments for format 
[email protected]:~$ ./a.out 
Enter text: manav 
D 
Enter interger: 12345 
372 
[email protected]:~$ 
+0

Manav, basado en algunas de sus preguntas recientes, haría bien en leer un libro de texto. –

+0

@Alok: Bueno, he leído un libro de texto pero no había entrado en esos detalles. La mayoría de los libros de texto no brindan ejemplos para el uso en tiempo real. Creo que lo mejor sería leer el libro de texto "The C Compiler Design". –

+1

@Manav: Definitivamente no necesita un libro "C Compiler Design". ¿Has probado K & R? –

Respuesta

83

Para printf, el * le permite especificar la anchura mínima de campo a través de un parámetro adicional, es decir printf("%*d", 4, 100); especifica un ancho campo de 4.

Para scanf, el * indica que el campo es para ser leído, pero ignorado, de modo que, por ejemplo, scanf("%*d %d", &i) para la entrada "12 34" ignorará 12 y leerá 34 en el entero i.

+0

cambie este "printf ("% * d ", 4, 100);" a "printf ("%. * d ", 4, 100);" .* debería ser usado. – Sridharan

5

El * se utiliza para omitir una entrada sin ponerlo en cualquier variable. Entonces scanf("%*d %d", &i); leería dos enteros y pondría el segundo en i.

El valor que se imprimió en el código es solo el valor que estaba en la variable i no inicializada; la llamada de escaneo no lo cambió.

18

La estrella es un personaje de la bandera, que dice ignorar el texto leído por la especificación. Para Qoute de la documentación de glibc:

Carácter opcional bandera `*', que dice ignorar el texto leído para esta especificación. Cuando scanf encuentra una especificación de conversión que usa esta bandera, lee la entrada como lo indica el resto de la especificación de conversión, pero descarta esta entrada, no usa un argumento de puntero y no incrementa el conteo de asignaciones exitosas.

Es útil en situaciones en las que la cadena de especificación que contiene más de un elemento, por ejemplo .: scanf("%d %*s %d", &i, &j) para la "12 test 34" - donde i & j son números enteros y desea ignorar el resto.

6

Ver here

Un asterisco de partida opcional indica que los datos se va a recuperar de la entrada estándar pero ignorado, es decir, que no se almacena en el argumento correspondiente.

2

En scanf("%*d",&a)* se salta la entrada. Para leer las entradas, se debe usar un "%d" adicional en scanf. Por ejemplo:

int a=1,b=2,c=3; 
    scanf("%d %*d %d",&a,&b,&c); //input is given as: 10 20 30 

O/p:

a=10 b=30 and c=3; // 20 is skipped 

Si utiliza otro %d es decir: scanf("%d %*d %d %d",&a,&b,&c); //input is given as: 10 20 30 40 entonces a = 10 b = 30 c = 40.

Si utiliza "," en scanf, no se tomará ningún valor después de %*d i.mi; scanf("%d %*d,%d" &a,&b,&c)// 10 20 30 O/p: a = 10 b = 2 c = 3 será la salida.