2011-05-24 13 views
26

Tengo una pregunta ficticia. Me gustaría imprimir un entero en un relleno de búfer con 0 pero no puedo ordenarlo en el formato sprintf. Estoy tratando los siguientesrelleno con sprintf

char buf[31]; 
int my_val = 324; 
sprintf(buf, "%d030", my_val); 

la esperanza de tener la siguiente cadena

"000000000000000000000000000324" 

¿qué estoy haciendo mal? No significa almohadilla con 0 para un ancho máximo de 30 caracteres?

Respuesta

52

"%030d" es el androide que busca

+8

Tenía que sonreír: D – jwueller

+2

"Los droides que está buscando están en el manual. Se llaman anchura y precisión". :-) – Jens

5

Probar:

sprintf(buf, "%030d", my_val); 
+2

Usted probablemente ya sabe esto, pero el uso de 'funciones de estilo snprintf' donde se especifica la longitud del búfer es un buen hábito para conseguirse en, ya que ayuda a prevenir los desbordamientos del búfer. – Matthew

7

El relleno y la anchura vienen antes el especificador de tipo:

sprintf(buf, "%030d", my_val); 
1

Es %030d, la tipo- carta al final.

2

Sus parámetros de precisión y ancho deben ir entre el '%' y el especificador de conversión 'd', no después. De hecho, todas las banderas sí. Entonces, si quiere un '+' precedente para números positivos, use '% + d'.

6

Tiene la sintaxis ligeramente incorrecta; El siguiente código produce la salida deseada:

char buf[31]; 
int my_val = 324; 
sprintf(buf, "%030d", (int)my_val); 

De Wikipedia's Article on Printf:

[...] printf("%2d", 3) results in " 3", while printf("%02d", 3) results in "03". 
+1

¿Por qué necesitas convertir 'my_val' a' int' cuando ya es un 'int'? – mc10