
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
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
.

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).
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).

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
, %lf
etc…
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. Utilizarputs(variable)
oprintf("%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