如何在C的printf中转义%(百分比)符号?


Answers:


421

您可以这样发布一个双'%'来对其进行转义: %%

使用您的示例:

printf("hello%%");

转义'%'符号仅适用于printf。如果您这样做:

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

它将打印: This is a's value: %%


8
“ printf(” hello %%“);” 是正确的。但这并不是我想逃避的机会。使用printf(“ hello \ 045”);
赖江山2009年

1
@Pablo Santa Cruz:这种“转义” %方法特定于printf,对吗?
Lazer

10
这是转义系统中非常普遍的规则的特例,转义系统使用<escape symbol> <escape symbol>来获取文字的转义符号。
dmckee ---前主持人小猫,2010年

12
赖江山,这行不通。\045是编译时转义,它是语言的一部分,%在编译时会转化为转义。printf是一个运行时函数,因此它处理字符串的字节而不是C源代码,并且它具有自己的转义序列,这些序列是函数的一部分。简而言之,printf是“一种语言内部的语言”,printf("This is a's value: %s\n", a);其结果与相同printf("This is a's value: \045\0163\012", a);
Triang3l 2013年

5
另外,您可以执行以下操作:printf("hello%c", '%');。但是,%%最好不要使用其他参数。
Triang3l 2013年

36

正如其他人所说,%%将逃脱%。

但是请注意,您永远不要这样做:

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

每当您必须打印字符串时,始终,始终,始终使用

printf("%s", c)

防止嵌入式%引起问题[内存违规,段错误等]


该警告通常是适当的,但是在某些情况下,您需要执行“此”操作-只要您知道您提供的字符串将被解释为格式字符串即可。
PP。

2
我一次想出了一个替代解决方案-将缓冲区复制到另一个缓冲区,然后将其倍增%符号。我最终遇到了这个想法,并用一行替换了20-30行的函数。不用担心,我确实应该在头部上狠狠地殴打自己。
Graeme Perrow,

是的,但是不要忘记,在获得格式字符串的99%的时间内,您将参数作为va_list获得,因此您需要使用vprintf。因此,从技术上来说我是正确的;)
Mikeage

2
放置puts(c)非常容易。如果
威廉·珀塞尔

1
放置追加换行符。这通常是不想要的行为。
Mikeage

33

如果字符串中没有格式,则可以使用puts(或fputs):

puts("hello%");

如果字符串中有格式:

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

如注释中所述,puts将a附加\n到输出中,fputs但不附加。


4
还值得一提的是fputs(),因为它直接与fprintf()相对应。
蒂姆·波斯特

1
puts还会追加一个换行符(即使您已经有一个换行符)。如果您想要的话,太好了。否则...
Mikeage

@SinanÜnür:感谢您提醒我有关的信息puts。我从没想过puts要打印琴弦,就直接跳到了printf。不再。
Lazer


7

Nitpick:
您实际上并没有%在为printf()(和scanf())函数族指定格式的字符串中转义。

%,在printf()(和scanf())系列函数,启动转换规范。转换规范的规则之一指出,%作为转换说明符(紧随%转换规范开始之后的)导致在'%'不转换任何参数的情况下写入字符。

该字符串实际上包含2个'%'字符(与转义字符相反:"a\bc"是具有3个非空字符"a%%b"的字符串;是具有4个非空字符的字符串)。


2
从技术上讲,它仍在“逃避”;特殊字符需要一种方法来“逃脱”其特殊含义并回到其“字符本性”
ShinTakezou 2010年


4

像这样:

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

3

C中的反斜杠用于转义字符串中的字符。字符串不会将%识别为特殊字符,因此无需转义。Printf是另一回事:使用%%打印一个%。


3

您可以使用 %%:

printf("100%%");

结果是:

100%



2

是的,请使用printf(“ hello %%”); 完成了。


2

您可以简单地使用%两次,即"%%"

例:

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

1

双'%'工作也在“.Format(...)实施例(与iDrawApertureMask == 87,fCornerRadMask == 0.05): csCurrentLine.Format("\%ADD%2d%C,%6.4f*\%",iDrawApertureMask,fCornerRadMask) ; 给出的(字符串内容中)的所需和预期值csCurrentLine;” %ADD87C,0.0500 *% ”

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.