2012-05-13 26 views
12

que tienen una cadena de formato como esto:¿Cómo puedo imprimir la misma variable en una cadena varias veces?

buf[] = "A%d,B%d,C%d,D%d,F%d,G%d,H%d,I%d,J%d"; 

y quiero insertar el mismo número entero para cada %d así que utilizo:

int val = 6; 
sprintf(buf2, buf, val,val,val,val,val,val,val,val,val); 

¿Puedo usar sprintf de una manera que sólo me exige para escribir val una vez, y sprintf lo usará para cada %d?

Respuesta

15

Sí, puede utilizar %1$d cada vez. El 1$ hace referencia al segundo argumento, obviamente también podrías hacerlo con otros argumentos.

Demostración: http://codepad.org/xVmdJkpN

Tenga en cuenta que el especificador de posición es una extensión POSIX - por lo que podría no funcionar con cada compilador. Si necesita que funcione, p. con el compilador de Visual C++, considere utilizar la fea manera de repetir el argumento o no use ninguna función de estilo printf. Otra opción sería usar una implementación sprintf compatible con POSIX o usar múltiples llamadas para agregar un número cada vez en un bucle (en caso de que la cadena de formato esté construida dinámicamente lo que le impediría especificar el número correcto de argumentos).


En una nota al margen, sprintf debe evitarse. Use snprintf(buf2, sizeof(buf2), ....) en su lugar. Por supuesto, esto requiere buf2 para tener un tamaño estático conocido en tiempo de compilación, pero si lo asigna manualmente puede simplemente usar la variable que contiene la longitud en lugar de sizeof(buf2).

+0

¿Es este estándar C? –

+0

Tenía razón la primera vez: use '% 1 $ d' porque' val' es el primer argumento de la cadena de formato. –

+0

¿Cuáles son los beneficios de usar snprintf sobre sprintf? – Rhexis

5

No hay una forma estándar (es decir, portátil) de hacerlo.

+0

Sin embargo, el OP explícitamente no pidió una forma estandarizada. No creo que haya una buena razón para no usar ninguna extensión útil hoy en día simplemente porque no están en el estándar. ¡Especialmente si no escribes alguna biblioteca súper genial que todos usen pronto! – ThiefMaster

+0

@ThiefMaster: Pero él tampoco especificó una plataforma en particular. La extensión POSIX no funciona en Visual C++, por ejemplo. –

Cuestiones relacionadas