В чем разница между printf () и put () в C? - PullRequest
160 голосов
/ 16 марта 2010

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

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

Ответы [ 10 ]

128 голосов
/ 16 марта 2010

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

84 голосов
/ 29 мая 2013

(на это указывает Zan Lynx в комментарии, но я думаю, что это заслуживает ответа - учитывая, что в принятом ответе это не упоминается).

Существенная разница между puts(mystr); и printf(mystr); заключается в том, что в последнем случае аргумент интерпретируется как строка форматирования . Результат будет часто одинаковым (за исключением добавленной новой строки), если строка не содержит управляющих символов (%), но если вы не можете полагаться на это (если mystr является переменной вместо литерала), вы следует не использовать его.

Таким образом, вообще опасно - и концептуально неправильно - передавать динамическую строку как один аргумент 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

То же самое относится к fputs против fprintf (но fputs не добавляет символ новой строки).

29 голосов
/ 17 июня 2012

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

16 голосов
/ 12 сентября 2013

В простых случаях компилятор преобразует вызовы в printf() в вызовы puts().

Например, следующий код будет скомпилирован с кодом сборки, который я покажу далее.

#include <stdio.h>
main() {
    printf("Hello world!");
    return 0;
}
* +1007 *

В этом примере я использовал GCC версии 4.7.2 и скомпилировал исходный код с gcc -o hello hello.c.

11 голосов
/ 16 марта 2010

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

10 голосов
/ 16 марта 2010

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

8 голосов
/ 16 марта 2010
int puts(const char *s);

put () записывает строку s и завершающий символ новой строки в стандартный вывод.

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

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

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

5 голосов
/ 11 июня 2010

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

2 голосов
/ 16 июня 2015

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

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

1 голос
/ 11 мая 2015

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...