Ответы:
Вы можете избежать этого, отправив двойной символ '%', например так: %%
Используя ваш пример:
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");