Sé que puedes imprimir con printf()
y puts()
. También puedo ver que le printf()
permite interpolar variables y formatear.
Es puts()
simplemente una versión primitiva de printf()
. ¿Debería usarse para todo lo posible printf()
sin interpolación de cadenas?
printf(variable)
para imprimir una cadena. Useputs(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.Respuestas:
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 quieres, puedesfputs
usar la cadena para stdout o usarprintf
.fuente
(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);
yprintf(mystr);
es que en este último el argumento se interpreta como una cadena de formato . El resultado será la misma frecuencia (a excepción de la nueva línea añadida) si la cadena no contiene caracteres de control (%
), pero si no se puede confiar en que (simystr
es una variable en lugar de un literal) se debe no usarlo.Por lo tanto, generalmente es peligroso, y conceptualmente incorrecto , pasar una cadena dinámica como argumento único de
printf
:Lo mismo se aplica a
fputs
vsfprintf
(perofputs
no agrega la nueva línea).fuente
printf()
sería menos eficiente? ¿En tiempo de ejecución? En tiempo de compilación?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 reemplazarloprintf
con call toputs
Además del formateo,
puts
devuelve un entero no negativo si tiene éxito oEOF
no; whileprintf
devuelve el número de caracteres impresos (sin incluir el nulo final).fuente
En casos simples, el compilador convierte llamadas
printf()
a llamadas aputs()
.Por ejemplo, el siguiente código se compilará con el código de ensamblaje que muestro a continuación.
En este ejemplo, utilicé GCC versión 4.7.2 y compilé la fuente con
gcc -o hello hello.c
.fuente
printf("Hello world!\n");
gcc, de hecho, eso se traduce en put. Como es un mensaje antiguo, lo editaré yo mismo.-save-temps
opción para gcc hace esoBien,
printf
podría considerarse como una versión más poderosa deputs
.printf
proporciona la capacidad de formato de las variables de salida utilizando especificadores de formato, tales como%s
,%d
,%lf
, etc ...fuente
En mi experiencia,
printf()
transporta más código queputs()
independientemente de la cadena de formato.Si no necesito el formato, no lo uso
printf
. Sin embargo,fwrite
astdout
obras mucho más rápido queputs
.Nota: por comentarios, '\ 0' es una constante entera. La expresión correcta debe ser la
sizeof(char)
indicada por los comentarios.fuente
'\0'
tiene tipoint
, por lo que en la mayoría de los sistemas se imprimiráUsing fwrit
. Si desea imprimir 1 byte menos, simplemente use 1.sizeof (char)
, que es probablemente lo que pretendía aquí, se garantiza que sea 1.puts () escribe la cadena sy una nueva línea final en stdout.
La función printf () escribe la salida en stdout, 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.
fuente
la función printf () se usa para imprimir cadenas y variables en la pantalla, mientras que la función put () solo le permite imprimir una cadena solo en su pantalla.
fuente
puts
es la opción simple y agrega una nueva línea al final yprintf
escribe la salida de una cadena formateada.Consulte la documentación para
puts
y paraprintf
.Recomendaría usar solo
printf
ya que esto es más consistente que el método de cambio, es decir, si está depurando, es menos doloroso buscar en todas las impresiones queputs
yprintf
. La mayoría de las veces también desea generar una variable en sus impresiones, por lo queputs
se usa principalmente en código de ejemplo.fuente
Al comparar
puts()
yprintf()
, a pesar de que su consumo de memoria es casi el mismo,puts()
lleva más tiempo en comparaciónprintf()
.fuente