¿Cuál es la diferencia entre printf() y puts() en C?

4 minutos de lectura

¿Cual es la diferencia entre printf y puts en C
Alex

Sé que puedes imprimir con printf() y puts(). también puedo ver eso printf() le permite interpolar variables y formatear.

Es puts() simplemente una versión primitiva de printf(). ¿Debería usarse para cada posible printf() sin interpolación de cadenas?

  • puts() vs printf() – Respuestas C/C++

    –Anthony Forloney

    16 de marzo de 2010 a las 13:05

  • Solo una nota sobre el uso de printf en lugar de puts: nunca, nunca hagas un printf(variable) para imprimir una cadena. Utilizar puts(variable) o printf("%s', variable). Existe un riesgo de seguridad al usar una cadena de formato variable: si un atacante puede escribir la variable, puede atacar el programa usando cadenas de formato.

    – Zan Lince

    1 de diciembre de 2012 a las 9:05

puts es mas simple que printf pero tenga en cuenta que el primero agrega automáticamente una nueva línea. Si eso no es lo que quieres, puedes fputs su cadena a stdout o use printf.

  • Creo que también es importante mencionar los argumentos adicionales que toma printf para agregar variables adicionales a la cadena de salida.

    – Erutan409

    26 de noviembre de 2015 a las 22:59

¿Cual es la diferencia entre printf y puts en C
leonbloy

(Esto se señala en un comentario de Zan Lynx, pero creo que merece una respuesta, dado que la respuesta aceptada no lo menciona).

La diferencia esencial entre puts(mystr); y printf(mystr); es que en este último el argumento se interpreta como una cadena de formato. El resultado será a menudo el mismo (excepto por la nueva línea agregada) si la cadena no contiene ningún carácter de control (%) pero si no puede confiar en eso (si mystr es una variable en lugar de un literal) debe no úsalo

Entonces, generalmente es peligroso -y conceptualmente incorrecto– para pasar una cadena dinámica como único argumento de printf:

  char * myMessage;
  // ... myMessage gets assigned at runtime, unpredictable content
  printf(myMessage);  // <--- WRONG! (what if myMessage contains a '%' char?) 
  puts(myMessage);    // ok
  printf("%s\n",myMessage); // ok, equivalent to the previous, perhaps less efficient

Lo mismo se aplica a fputs contra fprintf (pero fputs no agrega la nueva línea).

  • ¿De qué manera usaría printf() ser menos eficiente? ¿En tiempo de ejecución? ¿En tiempo de compilación?

    – franklin

    5 de enero de 2015 a las 16:51

  • @franklin en tiempo de ejecución, porque printf necesita analizar la cadena de formato. Sin embargo, esto normalmente debería ser irrelevante. Además, un compilador inteligente podría optimizar esto y reemplazar el printf con llamada a puts

    – leonbloy

    6 de enero de 2015 a las 14:12

Además de formatear, puts devuelve un entero no negativo si tiene éxito o EOF si no tiene éxito; tiempo printf devuelve el número de caracteres impresos (sin incluir el nulo final).

  • Cuando probé esto, puts devuelve la cantidad de caracteres en la cadena, incluido el carácter de terminación, mientras que printf devuelve la cantidad de caracteres impresos sin el carácter de terminación. Lo cual es técnicamente consistente con su definición, ya que el primero es un número entero no negativo, pero no estoy seguro de si eso es lo que quiso decir.

    – Lou

    22 de abril de 2021 a las 16:13

  • @lou, ¿está seguro de que el extra incluido proviene del terminador nulo pero no del ‘\n’?

    – divergente

    15 de enero a las 0:25


¿Cual es la diferencia entre printf y puts en C
hannu balk

En casos simples, el compilador convierte las llamadas a printf() a las llamadas a puts().

Por ejemplo, el siguiente código se compilará en el código ensamblador que muestro a continuación.

#include <stdio.h>
main() {
    printf("Hello world!");
    return 0;
}
push rbp
mov rbp,rsp
mov edi,str.Helloworld!
call dword imp.puts
mov eax,0x0
pop rbp
ret

En este ejemplo, utilicé la versión 4.7.2 de GCC y compilé el código fuente con gcc -o hello hello.c.

int puts(const char *s);

pone() escribe la cadena s y una nueva línea final en stdout.

int printf(const char *format, ...);

La función imprimirf() escribe la salida en la salida estándar, bajo el control de una cadena de formato que especifica cómo se convierten los argumentos posteriores para la salida.

Aprovecharé esta oportunidad para pedirle que lea la documentación.

En mi experiencia, printf() transporta más código que puts() independientemente de la cadena de formato.

Si no necesito el formato, no uso printf. Sin embargo, fwrite para stdout funciona mucho más rápido que puts.

static const char my_text[] = "Using fwrite.\n";
fwrite(my_text, 1, sizeof(my_text) - sizeof('\0'), stdout);

Nota: según los comentarios, ‘\ 0’ es una constante entera. La expresión correcta debe ser sizeof(char) como indican los comentarios.

Derecha, printf podría considerarse como una versión más poderosa de puts. printf proporciona la capacidad de formato variables para la salida usando especificadores de formato como %s, %d, %lfetc…

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad