(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á 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 (si mystr
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
:
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
vs fprintf
(pero fputs
no agrega la nueva línea).
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.