В чем разница между printf() и puts() в C?
Я знаю, что вы можете печатать с printf()
и puts()
. Я также вижу, что printf()
позволяет интерполировать переменные и делать форматирование.
и puts()
просто примитивная версия printf()
. Должен ли он использоваться для всех возможных printf()
без интерполяции строк?
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
vsfprintf
(а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(''), 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. В большинстве случаев вы хотите вывести переменную в ваши распечатки, поэтому ставит в основном используется в примере кода.