imprime un argumento dos veces

3 minutos de lectura

Quiero pasar un argumento adicional a printf e imprimirlo dos veces, por ejemplo

printf("%s%s","somestring");       // prints somestringsomestring

¿Hay alguna manera de hacer esto?

  • stackoverflow.com/questions/19327441/…

    – Barmar

    26 de mayo de 2017 a las 1:43

  • En ISO C, necesitaría usar una variable (o una lista de varargs) para contener el valor y luego especificarlo dos veces en la lista de argumentos

    –MM

    26 de mayo de 2017 a las 2:16

  • ¿Existe una necesidad práctica para esto o esta es una pregunta teórica?

    – i486

    26 de mayo de 2017 a las 12:52

avatar de usuario de dbush
arbusto

Si está en Linux o en algún otro sistema similar a UNIX, puede usar $ para especificar el número de argumento:

printf("%1$s%1$s\n", "hello");

En este ejemplo, 1$ significa “usar el primer argumento”. También usamos esta sintaxis varias veces para que podamos usar un argumento dado más de una vez.

los Página del manual de Linux para printf da más detalles:

Los argumentos deben corresponder correctamente (después de la promoción de tipo) con el especificador de conversión. De forma predeterminada, los argumentos se usan en el orden dado, donde cada ‘*’ y cada especificador de conversión solicitan el siguiente argumento (y es un error si no se dan suficientes argumentos). También se puede especificar explícitamente qué argumento se toma, en cada lugar donde se requiere un argumento, escribiendo “%m$” en lugar de ‘%’ y “m$” en lugar de ‘‘, donde el entero decimal m denota la posición en la lista de argumentos del argumento deseado, indexado a partir de 1. Por lo tanto,

printf("%*d", width, num);

y

printf("%2$*1$d", width, num);

son equivalentes. El segundo estilo permite referencias repetidas al mismo argumento. El estándar C99 no incluye el estilo que usa ‘$’, que proviene de la especificación UNIX única. Si se usa el estilo que usa ‘$’, debe usarse en todas las conversiones que toman un argumento y todos los argumentos de ancho y precisión, pero se puede mezclar con formatos “%%” que no consumen un argumento. No puede haber espacios en la cantidad de argumentos especificados usando ‘$’; por ejemplo, si se especifican los argumentos 1 y 3, el argumento 2 también debe especificarse en algún lugar de la cadena de formato.

  • Muchas gracias. Aceptaré cuando el sistema me lo permita.

    – CARNE DE RES MUERTA

    26 de mayo de 2017 a las 1:45

  • Solo una nota por man 3 printf: “El estándar C99 no incluye el estilo que usa ‘$’, que proviene de la especificación UNIX única.

    –David C. Rankin

    26 de mayo de 2017 a las 1:54

  • ^ en otras palabras, esta es una extensión POSIX

    –MM

    26 de mayo de 2017 a las 2:15

  • Además, ¿hay alguna forma en que pueda hacer printf("hello%s"); y haz que se imprima hellohello%spor ejemplo, imprimir el argumento 0? 0$ no funciona.

    – CARNE DE RES MUERTA

    26 mayo 2017 a las 16:46


  • @0xBADC0DE No, eso no funcionará. La cadena de formato es lo que define cuáles son los siguientes argumentos. No puede hacer referencia a sí mismo de esa manera.

    – dbush

    26 mayo 2017 a las 16:50

¿Ha sido útil esta solución?