В чем разница между printf() и puts() в C?

Я знаю, что вы можете печатать с printf() и puts(). Я также вижу, что printf() позволяет вам интерполировать переменные и делать форматирование.

Является puts() просто примитивной версией printf(). Должен ли он использоваться для всех возможных printf() без строковой интерполяции?

Ответ 1

puts проще, чем printf, но имейте в виду, что первый автоматически добавляет новую строку. Если это не то, что вы хотите, вы можете fputs указать свою строку в stdout или использовать printf.

Ответ 2

(Это указано в комментарии 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 не добавляет новую строку).

Ответ 3

Помимо форматирования, puts возвращает неотрицательное целое число в случае успеха или EOF, если оно не выполнено; а printf возвращает количество напечатанных символов (не включая конечный нуль).

Ответ 4

В простых случаях компилятор преобразует вызовы на 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.

Ответ 5

Правильно, printf можно рассматривать как более мощную версию puts. printf предоставляет возможность форматирования переменных для вывода с использованием спецификаторов формата, таких как %s, %d, %lf и т.д.

Ответ 6

По моему опыту 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), как указано в комментариях.

Ответ 7

int puts(const char *s);

puts() записывает строку s и завершающую новую строку в stdout.

int printf(const char *format, ...);

Функция printf() записывает вывод в stdout под управлением строки формата, которая указывает, как последующие аргументы преобразуются для вывода.

Я воспользуюсь этой возможностью, чтобы попросить вас ознакомиться с документацией.

Ответ 8

Функция printf() используется для печати обеих строк и переменных на экране, в то время как функция puts() позволяет вам печатать строку только на вашем экране.

Ответ 9

puts - это простой выбор и добавляет новую строку в конец, а printf записывает вывод из форматированной строки. Документация для puts: http://linux.die.net/man/3/puts и для printf: http://linux.die.net/man/3/printf

Я бы рекомендовал использовать только printf, так как это более согласовано, чем метод переключения, т.е. если вы debbugging, менее болезненно искать все printfs, чем puts и printf. В большинстве случаев вы хотите вывести переменную в свои распечатки, поэтому puts в основном используется в примере кода.

Ответ 10

При сравнении puts() и printf(), хотя потребление памяти почти одинаково, puts() занимает больше времени по сравнению с printf().