2009-12-07 3 views

ответ

334

Вы можете избежать этого, разместив двойной '%', как это: %%

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

printf("hello%%"); 

Выходящий знак '%' только для Printf. Если вы делаете:

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

Это будет печатать: This is a's value: %%

+7

"Е (" привет %% ");" верно. Думаю, это не побег. используйте printf ("hello \ 045"); –

+0

@Pablo Santa Cruz: этот метод «escape» '%' специфичен для 'printf', правильно? – Lazer

+0

@eSKay: правильный. Только для printf. –

9

С собой ...

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

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

puts("hello%"); 

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

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

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

+6

+1, так что многие люди забывают о том (или иметь никогда не слышал) ставит(). Я вижу так много людей, использующих Е() для строк, которые не имеют никакого отношения к расширению. Это лучший ответ. –

+3

Стоит отметить, fputs() также, как это непосредственно взаимности на fprintf(). –

+1

пут также добавляет новую строку [даже если у вас уже есть] .Если вы этого хотите, отлично. В противном случае ... – Mikeage

33

Как уже говорилось, %% избежит%.

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

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

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

printf("%s", c) 

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

+0

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

+2

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

+0

Правда, но не забывайте, что в 99% случаев, когда вы получаете строку формата, вы получаете аргументы как va_list, поэтому вам нужно использовать vprintf. Таким образом, я технически корректен;) – Mikeage

3

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

4

Как это:

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

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

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

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

+1

технически, он все еще «ускользает»; персонажи, которые являются особыми, нуждаются в способе «избежать» своего особого значения и вернуться к их «характеру характера» – ShinTakezou

2

Да, использование Е ("привет %%"); и все сделано.

-4

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

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

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

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

+3

№ Неправильно. См. Другие ответы. –

+4

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

2

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

printf("hello%%"); 

Подробнее all format specifiers used in C.

2

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

Пример:

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

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

printf("100%%"); 

Результат:

100%

0

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

Смежные вопросы