2012-03-30 33 views
8

¿Qué es %*d? Sé que %d se usa para integers, así que creo que %*d también debe estar relacionado únicamente con el número entero. ¿Cuál es el propósito de esto? ¿Qué hace?¿Cuál es la diferencia entre% d y% * d en el lenguaje c?

int a=10,b=20; 
printf("\n%d%d",a,b); 
printf("\n%*d%*d",a,b); 

resultado es

10 20 
1775 1775 
+4

Parece un especificador de ancho: http://www.cplusplus.com/reference/clibrary/cstdio/printf/ – Mysticial

+2

@Mysticial Debe escribir eso como una respuesta .. – Ben

+0

@Ben, es solo un enlace - que no lo hace no califica como una respuesta. Soy demasiado perezoso para expandirlo ... – Mysticial

Respuesta

10

cuando se utiliza con scanf() funciona, significa que un número entero se analiza, pero el resultado no se almacena en cualquier lugar.

Cuando se utiliza con funciones printf(), significa que el argumento de ancho se especifica mediante el siguiente argumento de formato.

5

El * se utiliza como una indicación de que la anchura se pasa como un parámetro de printf

+1

Entonces, ¿por qué produce la salida 1775 1775? – Parag

+1

printf es una función de argumento variable, por lo que cuando se analiza la cadena de formato, busca un número entero que representa el ancho del primer valor, el valor en sí mismo, el ancho del segundo valor y el segundo valor. Como solo está aprobando 2 valores, los valores utilizados no están definidos. Intente usar 4 valores significativos y vea el resultado. – guga

17

El %*d en un printf le permite usar una variable para controlar el ancho de campo, a lo largo de las líneas de:

int wid = 4; 
printf ("%*d\n", wid, 42); 

que le dará:

..42 

(con cada uno de los 0.123.caracteres siendo un espacio). El * consume un argumento wid y el d consume el 42.

La forma que tiene, como:

printf ("%*d %*d\n", a, b); 

es un comportamiento no definido según la norma, ya que debe proporcionar cuatro argumentos después de que la cadena de formato, no dos (y buenos compiladores como gcc le dirá sobre esto si subes el nivel de advertencia). De C11 7.20.6 Formatted input/output functions:

Si no hay argumentos suficientes para el formato, el comportamiento no está definido.

Debería ser algo como:

printf ("%*d %*d\n", 4, a, 4, b); 

Y la razón de que está recibiendo la salida extraña se debe a que el comportamiento no definido. This excellent answer le muestra el tipo de cosas que pueden salir mal (y por qué) cuando no sigue las reglas, especialmente en relación con esta situación.

Ahora no sería de esperar que esto sea un problema de falta de alineación, ya que está utilizando int para todos los tipos de datos pero, como con todo el comportamiento indefinido, nada puede suceder.

+1

+1 para "Esta respuesta excelente" ... :) – guga

+0

Explicación buena. :) – barnes

Cuestiones relacionadas