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


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

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

10 146

10 ответов:

puts проще printf но имейте в виду, что первый автоматически добавляет новую строку. Если это не то, что вы хотите, вы можете fputs ваша строка для stdout или использовать 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 если неудачно; в то время как 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(''), 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() и printf(), хотя их потребление памяти почти одинаковое,puts() занимает больше времени по сравнению с printf().