В чем разница между printf ("% s"), printf (s) и fputs? - PullRequest
0 голосов
/ 04 февраля 2019
char s[100]={0};
fgets(s, sizeof(s), stdin);

В контексте кода выше, в чем разница между этими тремя?

  1. printf("%s",s);
  2. printf(s);
  3. fputs(s,stdout);

Ответы [ 3 ]

0 голосов
/ 04 февраля 2019

# 2 Следует использовать НИКОГДА .Я даже не буду писать это здесь.Злой ввод может сделать очень плохие вещи в вашей системе, вводя специальные символы.Новые версии gcc предупреждают вас об этой ошибке.

Разница между printf("%s", s); и puts(s) заключается в том, что puts добавит новую строку, как если бы вы позвонили printf("%s\n", s);

0 голосов
/ 04 февраля 2019

Как уже упоминалось в других комментариях и ответах, не пытайтесь использовать второй вариант.Кроме того, третий вариант намного легче первого.

Однако я все же предпочитаю первый вариант (функция printf()), поскольку он позволяет вам иметь отформатированную строку, что означает, что вы можете распечатать почтилюбой тип данных, использующий эту функцию, тогда как функция fputs принимает только строки.Поэтому в большинстве случаев вам придется сначала отформатировать строку (возможно, используя sprintf()), прежде чем передать ее в функцию!

0 голосов
/ 04 февраля 2019
  1. printf("%s",s); правильно, но printf - очень тяжелая функция, и большинство компиляторов фактически заменяют ее на вставки в код компилятора, если строка формата заканчивается на '\ n'

  2. Е (s);очень опасно, поскольку строка формата может содержать %, и тогда она будет ожидать других параметров.Если это произойдет, это UB.Это также делает ваш код уязвимым для эксплойтов

  3. fputs (s, stdout);ХОРОШО.Не такой тяжелый, как printf, но добавит новую строку

...