2015-11-12 4 views
1

Это приемлемо?Правильное использование fprintf

fprintf(fp,"Just a string"); 

или

fprintf(fp,stringvariable); 

против

fprintf(fp,"%s","Just a string"); 

Это кажется запутанным для меня, как строки переменной (или постоянной) используется как форматирование против самого выхода. Строковая переменная имела формат, специфичный для контента («% s» и т. Д.), Тогда выход был бы не таким, как предполагалось.

Для вывода строки (без форматирования), что лучше?

fprintf(fp,"%s",stringvariable); 

или

fputs(stringvariable,fp); 
+0

Вы можете безопасно 'printf()' строковый литерал (вы все равно не можете его избежать). Но если строка изменчива, особенно по предоставленным пользователем данным, вы рискуете уязвимостями в формате строки. – EOF

ответ

2

Это приемлемо, если вы «знаете» строка переменной, чтобы быть «чистыми», если вы не заботитесь о предупреждении наиболее современные компиляторы генерируют для этой конструкции. Поскольку:

  1. Если строка содержит спецификатор преобразования «от несчастного случая», вы призываете к неопределенному поведению.

  2. Если вы прочтете эту строку откуда-то, злоумышленник может использовать точку 1. выше своих целей.

Это вообще лучше использовать puts() или fputs(), как они избегают этой проблемы, и, следовательно, не генерирует предупреждение. (puts() также бросается в автоматическом режиме '\n'.)

Функции *puts() также имеют (незначительно) лучшую производительность. *printf(), даже на не более чем "%s" в качестве строки формата еще должен проанализировать этот спецификатор преобразования и подсчитать количество символов, напечатанных для его возвращаемого значения.

Благодаря пользователям «rici» и «Grady Player» для указания предупреждения о символе и компилятора. Кажется, мой C немного ржавый. ;-)

+3

fprintf возвращает количество напечатанных символов, поэтому% n не имеет значения. Я бы сказал, что * всегда * лучше использовать fputs (не ставит, если вы не хотите добавить новую строку), и что идиома fprintf спрашивает о том, что «не приемлемо» (в обзоре кода, сделанном мной, по крайней мере) но я полагаю, что это вопрос мнения. – rici

+2

Я перепробовал, потому что есть много информации, но современные компиляторы имеют предупреждение об использовании переменной в качестве строки формата ... Я думаю, что это просто хорошая привычка не делать этого –

+0

Моя проблема: у меня есть несколько строк без форматирование и некоторые с форматированными ints или float или что-то еще. Таким образом, по мере их изменения больно полностью изменить вызов и порядок аргументов. Это приводит меня к fprintf (fp, «% s», var). – Jiminion