Ответ 1
puts
проще, чем printf
, но имейте в виду, что первый автоматически добавляет новую строку. Если это не то, что вы хотите, вы можете fputs
указать свою строку в stdout или использовать printf
.
Я знаю, что вы можете печатать с printf()
и puts()
. Я также вижу, что printf()
позволяет вам интерполировать переменные и делать форматирование.
Является puts()
просто примитивной версией printf()
. Должен ли он использоваться для всех возможных printf()
без строковой интерполяции?
puts
проще, чем printf
, но имейте в виду, что первый автоматически добавляет новую строку. Если это не то, что вы хотите, вы можете fputs
указать свою строку в stdout или использовать printf
.
(Это указано в комментарии Zan Lynx, но я думаю, что он заслуживает ответа - учитывая, что принятый ответ не упоминает об этом).
Существенное различие между puts(mystr);
и printf(mystr);
заключается в том, что в последнем аргумент интерпретируется как строка форматирования. Результат будет тем же самым (за исключением добавленной новой строки), если строка не содержит никаких управляющих символов (%
), но если вы не можете полагаться на это (если mystr
- это переменная вместо литерала), вы не следует использовать его.
Итак, это вообще опасно - и концептуально неправильно - использовать переменную для первого аргумента 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
То же самое относится к fputs
vs fprintf
(но fputs
не добавляет новую строку).
Помимо форматирования, puts
возвращает неотрицательное целое число в случае успеха или EOF
, если оно не выполнено; а printf
возвращает количество напечатанных символов (не включая конечный нуль).
В простых случаях компилятор преобразует вызовы на printf()
на вызовы puts()
.
Например, следующий код будет скомпилирован для кода сборки, который я покажу далее.
#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
В этом примере я использовал GCC версии 4.7.2 и скомпилировал источник с gcc -o hello hello.c
.
Правильно, printf
можно рассматривать как более мощную версию puts
. printf
предоставляет возможность форматирования переменных для вывода с использованием спецификаторов формата, таких как %s
, %d
, %lf
и т.д.
По моему опыту printf()
отображает больше кода, чем puts()
, независимо от строки формата.
Если мне не требуется форматирование, я не использую printf
. Однако fwrite
до stdout
работает намного быстрее, чем puts
.
static const char my_text[] = "Using fwrite.\n";
fwrite(my_text, 1, sizeof(my_text) - sizeof('\0'), stdout);
Примечание: в комментариях '\ 0' является целочисленной константой. Правильное выражение должно быть sizeof(char)
, как указано в комментариях.
int puts(const char *s);
puts() записывает строку s и завершающую новую строку в stdout.
int printf(const char *format, ...);
Функция printf() записывает вывод в stdout под управлением строки формата, которая указывает, как последующие аргументы преобразуются для вывода.
Я воспользуюсь этой возможностью, чтобы попросить вас ознакомиться с документацией.
Функция printf() используется для печати обеих строк и переменных на экране, в то время как функция puts() позволяет вам печатать строку только на вашем экране.
puts - это простой выбор и добавляет новую строку в конец, а printf записывает вывод из форматированной строки. Документация для puts: http://linux.die.net/man/3/puts и для printf: http://linux.die.net/man/3/printf
Я бы рекомендовал использовать только printf, так как это более согласовано, чем метод переключения, т.е. если вы debbugging, менее болезненно искать все printfs, чем puts и printf. В большинстве случаев вы хотите вывести переменную в свои распечатки, поэтому puts в основном используется в примере кода.
При сравнении puts()
и printf()
, хотя потребление памяти почти одинаково, puts()
занимает больше времени по сравнению с printf()
.