如何在C语言的printf函数中转义百分号(%)符号

336

在C语言中使用printf时,如何转义百分号(%)?

printf("hello\%"); /* not like this */

1
"hello\%"无法正常工作,因为它会像"hello%"一样生成字符串hello%加上NUL。 - ikegami
1
"hello\%" doesn't work because... for me... it does not compile. I used Microsoft Visual Studio 2017. The compilation fails with the message: '%': unrecognized character escape sequence. - Djibril NDIAYE
@DjibrilNDIAYE 看起来 clang 和 gcc 有他们的理由 反对标准并允许 \% - Ruud Helderman
13个回答

512

你可以通过使用两个百分号 "%%" 来转义它,像这样:%%

以你的例子为例:

printf("hello%%");

转义百分号符号只适用于printf。 如果您执行以下操作:

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

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


9
“printf("hello%%");”是正确的。但我认为这不是一个转义。使用printf("hello\045");。 - Lai Jiangshan
1
@Pablo Santa Cruz:这种“转义”百分号的方法只适用于printf,对吗? - Lazer
10
这是转义系统中非常常见的规则的一个特例,为了获得文字上的转义符号,您需要使用<转义符号><转义符号>。 - dmckee --- ex-moderator kitten
12
Lai Jiangshan,这样行不通。\045 是编译时转义符,是语言的一部分,在编译后会变成 %printf 是一个运行时函数,因此它处理的是字符串的字节,而不是 C 源代码,并且它有自己的转义序列是函数的一部分。简而言之,printf 是“语言中的语言”,printf("This is a's value: %s\n", a);printf("This is a's value: \045\0163\012", a); 会得到相同的结果。 - Triang3l
6
你可以使用printf("hello%c", '%')来实现这个功能。不过,最好使用%%,因为它不需要使用另一个参数。 - Triang3l
显示剩余5条评论

43

正如其他人所说,%%将会转义%符号。

然而,请注意,您永远不应该这样做:

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

每当你需要打印一个字符串时,一定要,一定要,一定要使用

printf("%s", c)

为了防止嵌入的百分号引起问题(如内存违规,分段错误等),需要进行转义。


4
曾有另一种解决方案 - 将缓冲区复制到另一个缓冲区,然后通过它将百分号加倍。最终我想出了这个主意,并用一行代码替换了原来 20-30 行的函数。别担心,我自己也狠狠地打了自己一顿,因为我应该做得更好。 - Graeme Perrow
2
做 puts(c) 简单多了。 - William Pursell
1
puts函数会在输出的末尾添加一个换行符,这通常是不需要的行为。 - Mikeage
1
@Mikeage:如果不需要,可以使用fputs(string, stdout);或者printf("%s", string); - Jonas Kölker
但是<CString>.Format(L"%s", <char>)会导致我的程序崩溃。尽管有时会崩溃,但我仍在使用<CString>.Format(L"%c", <char>)。 - Moses
显示剩余2条评论

36
如果字符串中没有格式要求,您可以使用 puts(或fputs):
puts("hello%");

如果字符串中存在格式:

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

正如评论中所指出的,puts 会将 \n 添加到输出中,而 fputs 则不会。


6
值得一提的是,fputs() 函数与 fprintf() 相互呼应,可以直接使用。 - Tim Post
1
puts函数也会添加一个换行符[即使你已经有了一个]。如果你需要这个,那很好。否则... - Mikeage
@Sinan Ünür:感谢您提醒我使用puts。我从来没有想过用puts打印字符串,直接跳到了printf。不再这样了。 - Lazer

12

通过自身...

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

8

7

小问题:
在指定 printf()(和scanf())函数格式的字符串中,您实际上没有转义 %

%printf()(和scanf())函数中开始一个转换规范。 转换规范的规则之一是,将 % 作为转换说明符(紧随开始转换规范的 %)会导致写入一个带有未转换参数的 '%' 字符。

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


2
从技术上讲,它仍然是“转义”的;特殊字符需要一种方法来“转义”它们的特殊含义并回到它们的“字符本质”。 - ShinTakezou

6

像这样:

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

6

您可以使用%%:

printf("100%%");

结果如下:

结果是:

100%


5

您正在使用错误的格式说明符。应该使用%%来打印%。您的代码应该是:

printf("hello%%");  

阅读更多关于在C编程中使用的所有格式说明符的信息,请单击此处


4
在C语言中,反斜杠用于转义字符串中的字符。字符串不会将%识别为特殊字符,因此不需要进行转义。但是在使用printf函数时,需要使用%%来打印一个%符号。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接