Как избежать знака% (процентов) в printf C?

202

Как вы избегаете знака% при использовании printf в C?

printf("hello\%"); /* not like this */
Теги:
printf

14 ответов

340
Лучший ответ

Вы можете избежать этого, разместив двойной "%" следующим образом: %%

Используя ваш пример:

printf("hello%%");

Вывод "%" только для printf. Если вы выполните:

char a[5];
strcpy(a, "%%");
printf("This is a value: %s\n", a);

Он напечатает: This is a value: %%

  • 8
    "Е (" привет %% ");" правильно. Но это не бегство, я думаю. используйте printf ("привет \ 045");
  • 1
    @Pablo Santa Cruz: этот метод "escape" % специфичен для printf , правильно?
Показать ещё 9 комментариев
33

Как говорили другие, %% выйдет из%.

Обратите внимание, что вы никогда не должны этого делать:

char c[100];
char *c2;
...
printf(c); /* OR */
printf(c2);

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

printf("%s", c)

чтобы предотвратить возникновение проблем с встроенным% [нарушениями памяти, segfault и т.д.]

  • 0
    Предупреждение обычно уместно, однако могут быть ситуации, в которых вы хотите сделать «это» - если вы знаете, что предоставленная вами строка будет интерпретироваться как строка формата.
  • 2
    Однажды я придумал альтернативное решение - скопировать буфер в другой буфер, а затем пройти через него, удваивая знаки%. В конце концов я наткнулся на эту идею и заменил функцию из 20-30 строк одной строкой. Не волнуйтесь, я сильно ударил себя по голове, как я и заслуживал.
Показать ещё 5 комментариев
29

Если в строке нет форматов, вы можете использовать puts (или fputs):

puts("hello%");

если в строке есть формат:

printf("%.2f%%", 53.2);

Как отмечено в комментариях, puts добавляет \n к выходу, а fputs - нет.

  • 4
    Стоит также упомянуть функцию fputs (), так как она напрямую отвечает fprintf ().
  • 1
    put также добавляет новую строку [даже если она у вас уже есть]. Если ты этого хочешь, отлично. Иначе...
Показать ещё 1 комментарий
9

С собой...

printf("hello%%"); /* like this */
7

придираться:
Вы действительно не избегаете % в строке, которая определяет формат семейства функций printf()scanf()).

% в семействе функций printf()scanf()) начинает спецификацию преобразования. В одном из правил спецификации преобразования указано, что % как спецификатор преобразования (сразу после %, который начал спецификацию преобразования) вызывает запись символа '%' без преобразования аргументов.

Строка действительно содержит 2 '%' символов внутри (в отличие от экранирующих символов: "a\bc" - строка с 3 непустыми символами; "a%%b" - строка с 4 непустыми символами).

  • 1
    технически, это все еще "убегает"; персонажам, которые являются особенными, нужен способ «избежать» своего особого значения и вернуться к своей «природе характера»
7

используйте двойной %%

4

Вот так:

printf("hello%%");
//-----------^^ inside printf, use two percent signs together
3

Обратная косая черта в C используется для удаления символов в строках. Строки не будут распознавать% как особый символ, и поэтому никакого выхода не потребуется. Printf - другое дело: используйте %% для печати одного%.

2

Вы можете использовать %%:

printf("100%%");

Результат:

100%

2

Вы можете просто использовать % дважды, то есть "%%"

Пример:

printf("You gave me 12.3 %% of profit");
2

вы используете неправильный формат, вы должны использовать %% для печати %. Ваш код должен быть:

printf("hello%%");  

Подробнее все спецификаторы формата, используемые в C.

2

Yup, используйте printf ( "hello %%" ); и это было сделано.

0

Двойной "%" работает также в ".Format(...). Пример (с iDrawApertureMask == 87, fCornerRadMask == 0.05): csCurrentLine.Format("\%ADD%2d%C,%6.4f*\%",iDrawApertureMask,fCornerRadMask) ; дает желаемое и ожидаемое значение (содержимое строки в) csCurrentLine;    "% ADD87C, 0.0500 *%"

-2

Используйте это:

#include <stdio.h>
printf("hello%s%s");

Полный список спецификаторов формата, используемых с printf, можно найти здесь:

http://www.mekong.net/tech/printf.htm

  • 3
    Без ошибок. Смотрите другие ответы.
  • 4
    Совершенно неправильно. Не следуйте этому подходу. Использование «% s» с printf без указания какой-либо строки в качестве параметра может привести к непредсказуемым результатам (именно так обходятся многие эксплойты).

Ещё вопросы

Сообщество Overcoder
Наверх
Меню