Сравнение двух операторов printf - PullRequest
2 голосов
/ 20 июля 2011

пожалуйста, взгляните на два следующих утверждения c

printf("a very long string");
printf("%s","a very long string");

они дают такой же результат, но есть определенная разница под капотом ,так в чем же разница и какая из них лучше ?Пожалуйста, поделитесь своими идеями!

Ответы [ 6 ]

13 голосов
/ 20 июля 2011

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

5 голосов
/ 20 июля 2011

Первый printf работает следующим образом

'a' is not a special character: print it
' ' is not a special character: print it
'v' is not a special character: print it
...
'g' is not a special character: print it

Второй printf работает следующим образом

'%' is a special character:
    's' print the contents of the string pointed to by the 2nd parameter
1 голос
/ 20 июля 2011

Первый передает один параметр, а второй - 2, поэтому вызов в первом случае немного быстрее.

Но в первом printf () должен отсканировать длинную строку для определения форматаа во втором строка форматирования очень короткая, поэтому во втором, вероятно, обработка будет быстрее.

Более важно (во всяком случае, для меня), что "очень длинная строка" маловероятнабыть постоянной строкой, как в этом примере.Если вы печатаете длинную строку, вы, вероятно, используете указатель на то, что сгенерировала программа.В этом случае гораздо лучше использовать вторую форму, потому что в противном случае, где-то, как-то, когда-нибудь, длинная строка будет содержать спецификацию формата printf формата, и это заставит printf искать другой аргумент, и ваша программа потерпит крах.Именно эта проблема возникла у меня около недели назад в коде, который мы использовали в течение почти 20 лет.

Суть в том, что ваша спецификация формата printf всегда должна быть константной строкой.Если вам нужно вывести переменную, используйте printf("%s",var) или, что еще лучше, fputs(var, stdout).

0 голосов
/ 20 июля 2011

Прежде всего, вы должны определить «лучше» лучше, так как он сам по себе недостаточно умен. Лучше чем? производительность, обслуживание, читаемость, расширяемость ...

При наличии одной строки кода я бы выбрал вариант 1 почти для всех версий 'лучше'

  • Это более читабельно
  • Он делает то, что должен, и ничего более (принцип KISS)
  • Это быстрее (нет бессмысленного перемещения памяти, чтобы засунуть одну строку в другую). Но если вы не выполняете эту печать много раз подряд, это не такой уж большой плюс.
0 голосов
/ 20 июля 2011

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

% s принимает значение const char *, тогда как без аргументов просто печатает литеральное выражение.

Вы все еще можете явно указать другой указатель на const char * и изменить его содержимое без изменения выражения вывода.

0 голосов
/ 20 июля 2011

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

...