Я знаю, что вы можете печатать с printf()
и puts()
. Я также вижу, что printf()
позволяет интерполировать переменные и выполнять форматирование.
Это puts()
просто примитивная версия printf()
. Должно ли оно использоваться для всех возможных printf()
без интерполяции строк?
printf(variable)
чтобы напечатать строку. Используйтеputs(variable)
илиprintf("%s', variable)
. При использовании строки формата переменной существует угроза безопасности: если переменная может быть записана злоумышленником, он может атаковать программу, используя строки формата.Ответы:
puts
Проще,printf
но помните, что первый автоматически добавляет новую строку. Если это не то, что вы хотите, вы можете использоватьfputs
свою строку в stdout или использоватьprintf
.источник
(На это указывает комментарий Zan Lynx, но я думаю, что это заслуживает ответа - учитывая, что в принятом ответе это не упоминается).
Существенная разница между
puts(mystr);
иprintf(mystr);
заключается в том, что в последнем случае аргумент интерпретируется как строка форматирования . Результат часто будет таким же (за исключением добавленной новой строки), если строка не содержит управляющих символов (%
), но если вы не можете полагаться на это (еслиmystr
это переменная, а не литерал), вы не должны использовать ее.Таким образом, вообще опасно - и концептуально неправильно - передавать динамическую строку как один аргумент
printf
:То же самое относится к
fputs
противfprintf
(ноfputs
не добавляет новую строку).источник
printf()
будет менее эффективным? Во время выполнения? Во время компиляции?printf
нужно проанализировать строку формата. Однако это обычно не имеет значения. Кроме того, умный компилятор мог бы оптимизировать это, и заменить наprintf
вызов сputs
Помимо форматирования,
puts
возвращает неотрицательное целое число в случае успеха илиEOF
неудачи; whileprintf
возвращает количество напечатанных символов (не включая завершающий ноль).источник
В простых случаях компилятор преобразует вызовы
printf()
в вызовыputs()
.Например, следующий код будет скомпилирован с кодом сборки, который я покажу далее.
В этом примере я использовал GCC версии 4.7.2 и скомпилировал исходный код
gcc -o hello hello.c
.источник
printf("Hello world!\n");
GCC действительно переводит это в пут. Поскольку это старое сообщение, я буду редактировать его сам.-save-temps
опция для gcc делает этоПравильно,
printf
можно считать более мощной версиейputs
.printf
обеспечивает возможность форматирования переменных для вывода с помощью спецификаторов формата , таких как%s
,%d
,%lf
и т.д. ...источник
По моему опыту,
printf()
тянет больше кода, чемputs()
независимо от формата строки.Если мне не нужно форматирование, я не использую
printf
. Тем не менее,fwrite
дляstdout
работы намного быстрее , чемputs
.Примечание: в комментариях '\ 0' является целочисленной константой. Правильное выражение должно быть таким,
sizeof(char)
как указано в комментариях.источник
'\0'
имеет типint
, поэтому на большинстве систем это будет печататьUsing fwrit
. Если вы хотите напечатать на 1 байт меньше, просто используйте 1.sizeof (char)
, что, скорее всего, то, что вы намеревались здесь, гарантированно будет 1.put () записывает строку s и завершающий символ новой строки в stdout.
Функция printf () записывает вывод в stdout под управлением строки формата, которая указывает, как последующие аргументы преобразуются для вывода.
Я воспользуюсь этой возможностью, чтобы попросить вас прочитать документацию.
источник
функция printf () используется для вывода на экран как строк, так и переменных, в то время как функция put () позволяет печатать только строки на вашем экране.
источник
puts
это простой выбор и добавляет новую строку в конце иprintf
записывает вывод отформатированной строки.Смотрите документацию для
puts
и дляprintf
.Я бы порекомендовал использовать только, так
printf
как это более согласованно, чем метод переключения, т. Е. Если вы отлаживаете, поиск по всем printfs менее труден, чемputs
иprintf
. В большинстве случаев вы также хотите выводить переменную в своих распечатках, поэтомуputs
в основном используется в примере кода.источник
При сравнении
puts()
иprintf()
, хотя их потребление памяти почти одинаково,puts()
требуется больше времени по сравнению сprintf()
.источник