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:
putses más simple que,printfpero tenga en cuenta que el primero agrega automáticamente una nueva línea. Si eso no es lo que quieres, puedesfputsusar 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 (simystres 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
fputsvsfprintf(perofputsno agrega la nueva línea).fuente
printf()sería menos eficiente? ¿En tiempo de ejecución? En tiempo de compilación?printfnecesita analizar la cadena de formato. Sin embargo, esto normalmente debería ser irrelevante. Además, un compilador inteligente podría optimizar esto y reemplazarloprintfcon call toputsAdemás del formateo,
putsdevuelve un entero no negativo si tiene éxito oEOFno; whileprintfdevuelve 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-tempsopción para gcc hace esoBien,
printfpodría considerarse como una versión más poderosa deputs.printfproporciona 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,fwriteastdoutobras 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
putses la opción simple y agrega una nueva línea al final yprintfescribe la salida de una cadena formateada.Consulte la documentación para
putsy paraprintf.Recomendaría usar solo
printfya 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 queputsyprintf. La mayoría de las veces también desea generar una variable en sus impresiones, por lo queputsse 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