Ответы:
Вы можете избежать этого, отправив двойной символ '%', например так: %%
Используя ваш пример:
printf("hello%%");
Экранирующий знак «%» предназначен только для printf. Если вы делаете:
char a[5];
strcpy(a, "%%");
printf("This is a's value: %s\n", a);
Он напечатает: This is a's value: %%
%специфичен printf, правильно?
\045это escape-время компиляции, которое является частью языка и превратится в %при компиляции. printfэто функция времени выполнения, поэтому она имеет дело с байтами вашей строки, а не с исходным кодом на языке Си, и имеет свои собственные escape-последовательности, которые являются частью функции . Короче говоря, printfэто «язык внутри языка» и printf("This is a's value: %s\n", a);дает тот же результат, что и printf("This is a's value: \045\0163\012", a);.
printf("hello%c", '%');. Однако %%лучше, потому что он не использует другой аргумент.
Как уже говорили другие, %% избежит%.
Обратите внимание, однако, что вы никогда не должны делать это:
char c[100];
char *c2;
...
printf(c); /* OR */
printf(c2);
Всякий раз, когда вам нужно напечатать строку, всегда, всегда, всегда печатайте ее, используя
printf("%s", c)
чтобы предотвратить встраивание%% в проблемы [нарушения памяти, segfault и т. д.]
Если в строке нет форматов, вы можете использовать puts(или fputs):
puts("hello%");
если в строке есть формат:
printf("%.2f%%", 53.2);
Как отмечено в комментариях, putsдобавляет \nк выводу и fputsне делает.
puts. Я никогда не думал о putsпечати строк и прыгнул прямо к printf. Уже нет.
С собой ...
printf("hello%%"); /* like this */
Nitpick:
Вы на самом деле не экранируете %строку, которая определяет формат для семейства функций printf()(и scanf()).
%, В printf()(и scanf()) семейства функций, начинает спецификацию преобразования. Одно из правил для спецификации преобразования гласит, что %в качестве спецификатора преобразования (сразу после того, %который запустил спецификацию преобразования) вызывается запись '%'символа без преобразования аргумента.
Строка действительно имеет 2 '%'символа внутри (в отличие от экранирующих символов: "a\bc"строка с 3 ненулевыми символами; "a%%b"строка с 4 ненулевыми символами).
Обратная косая черта в C используется для экранирования символов в строках. Строки не будут распознавать% как специальный символ, и, следовательно, нет необходимости в экранировании. Другое дело в printf: используйте %%, чтобы напечатать один%.
Ты можешь использовать %%:
printf("100%%");
Результат:
100%
вы используете неверный спецификатор формата, который вы должны использовать %%для печати %. Ваш код должен быть:
printf("hello%%");
Подробнее все спецификаторы формата , используемые в Си .
Вы можете просто использовать %дважды, то есть"%%"
Пример:
printf("You gave me 12.3 %% of profit");