diferencia entre puts y printf
¿Cuál es la diferencia entre printf() y puts() en C? (10)
(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 la nueva línea añadida) 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 literal) no debe usarlo .
Entonces, generalmente es peligroso -y conceptualmente incorrecto- usar una variable para el primer argumento de printf
:
char * myMessage;
// ... myMessage gets filled at runtime with some unpredictable content
printf(myMessage); // WRONG! (what if myMessage contains a ''%'' char?)
puts(myMessage); // correct
printf("%s/n",myMessage); // equivalent to the above, perhaps less efficient
Lo mismo se aplica a fputs
vs fprintf
(pero fputs
no agrega la nueva línea).
Sé que puedes imprimir con printf()
y puts()
. También puedo ver que printf()
permite interpolar variables y formatear.
Is puts()
simplemente una versión primitiva de printf()
. ¿Debería usarse para todas las printf()
posibles printf()
sin interpolación de cadenas?
Además de formatear, puts
devuelve un entero no negativo si es exitoso o EOF
si no tiene éxito; mientras que printf
devuelve la cantidad de caracteres impresos (sin incluir el nulo final).
Al comparar puts()
y printf()
, aunque el consumo de memoria sea casi el mismo, puts()
tarda más tiempo que printf()
.
Correcto, printf
podría considerarse como una versión más poderosa de puts
. printf
proporciona la capacidad de formatear variables para salida usando especificadores de formato como %s
, %d
, %lf
, etc ...
En casos simples, el compilador convierte las llamadas a printf()
en llamadas a puts()
.
Por ejemplo, el siguiente código se compilará con el código de ensamblaje 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é la fuente con gcc -o hello hello.c
.
En mi experiencia, printf()
arrastra más código que puts()
independientemente de la cadena de formato.
Si no necesito el formato, no uso printf
. Sin embargo, fwrite
to 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: por comentarios, ''/ 0'' es una constante entera. La expresión correcta debe ser sizeof(char)
según lo indicado por los comentarios.
la función printf () se usa para imprimir cadenas y variables en la pantalla mientras que la función puts () solo le permite imprimir una cadena solo en su pantalla.
puts es la opción simple y agrega una nueva línea al final y printf escribe la salida de una cadena formateada. Documentación para puts: http://linux.die.net/man/3/puts y para printf: http://linux.die.net/man/3/printf
Yo recomendaría usar solo printf ya que esto es más consistente que el método de conmutación, es decir, si está depurando, es menos doloroso buscar todas las letras printfs que puts e printf. La mayoría de las veces también desea generar una variable en sus impresiones, por lo que puts se usa principalmente en código de ejemplo.
puts
es más simple que printf
pero tenga en cuenta que el primero agrega automáticamente una nueva línea. Si eso no es lo que quiere, puede fputs
su cadena a stdout o usar printf
.
int puts(const char *s);
puts () escribe la cadena sy una nueva línea final en stdout.
int printf(const char *format, ...);
La función printf () escribe salida en stdout, bajo el control de una cadena de formato que especifica cómo los argumentos posteriores se convierten para salida.
Aprovecharé esta oportunidad para pedirte que leas la documentación.