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

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

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

10 ответов


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


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


помимо форматирования, puts возвращает неотрицательное целое число, в случае успеха или EOF если неудачно; while 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, etc...


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

если мне не нужно форматирование, я не использую printf. Однако,fwrite до stdout работает намного быстрее, чем puts.

static const char my_text[] = "Using fwrite.\n";
fwrite(my_text, 1, sizeof(my_text) - sizeof(''), 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, поскольку это более согласовано, чем метод переключения, i.e если вы debbugging менее болезненно искать все printfs, чем puts и printf. В большинстве случаев вы хотите вывести переменную в ваши распечатки, поэтому ставит в основном используется в примере кода.


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