В чем разница между printf(%s), printf(s) и fputs?

char s[100]={0};
fgets(s, sizeof(s), stdin);

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

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

person user317427    schedule 04.02.2019    source источник
comment
Вы пробовали читать страницы руководства?   -  person Sourav Ghosh    schedule 04.02.2019
comment
Что происходит в каждом случае, если ваша строка выглядит так: "bad format %s %*d"?   -  person Gerhardh    schedule 04.02.2019
comment
printf(s); будет интерпретировать s, и если он содержит знак %, могут возникнуть непредсказуемые результаты.   -  person Paul Ogilvie    schedule 04.02.2019
comment
fputs(str, stdout) такое же, как puts(str), что проще.   -  person alx    schedule 04.02.2019


Ответы (3)


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

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

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

person 0___________    schedule 04.02.2019
comment
Я бы только добавил, что puts() добавляет новую строку - person alx; 04.02.2019

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

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

person alx    schedule 04.02.2019
comment
Легкий. Со строковым литералом опасности нет. Только если строка формата не является строковым литералом - person 0___________; 04.02.2019
comment
Да, в этом случае это безопасно, но я не вижу смысла писать строковый литерал таким образом, чтобы сэкономить несколько символов. Если в будущем кто-то изменит s на переменную, это приведет к ненужной ошибке. - person alx; 04.02.2019

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

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

person PhoenixBlue    schedule 04.02.2019