如何逃避C的printf中的%(百分号)符号?

Chr*_*_45 266 c printf format-string

printf在C中使用时,如何逃避%符号?

printf("hello\%"); /* not like this */
Run Code Online (Sandbox Code Playgroud)

Pab*_*ruz 406

您可以通过发布双重'%'来逃避它: %%

使用你的例子:

printf("hello%%");
Run Code Online (Sandbox Code Playgroud)

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

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

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

  • 赖江山,这不行.`\ 045`是编译时转义,它是**语言**的一部分,在编译时会变成'%`.`printf`是一个运行时函数,因此它处理字符串的字节,而不是C源代码,并且它有自己的转义序列,它们是**函数**的一部分.简而言之,`printf`是"语言中的语言",而`printf("这是一个值:%s \n",a);`给出与`printf相同的结果("这是一个值:\ 045\0163\012",a);`. (12认同)
  • 这是转义系统中非常常见的规则的一种特殊情况,即获取使用<escape symbol> <escape symbol>的文字转义符号. (10认同)
  • 的 "printf(" 你好%% ");" 是正确的.但我认为这不是逃避.使用printf("hello\045"); (8认同)
  • 另外,你可以这样做:`printf("hello%c",'%');`.但是,`%%`更好,因为它不使用另一个参数. (5认同)

Mik*_*age 36

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

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

char c[100];
char *c2;
...
printf(c); /* OR */
printf(c2);
Run Code Online (Sandbox Code Playgroud)

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

printf("%s", c)
Run Code Online (Sandbox Code Playgroud)

防止嵌入的%导致问题[内存违规,段错误等]

  • 我想出了一个替代解决方案 - 将缓冲区复制到另一个缓冲区,然后通过它将%符号加倍.我最终遇到了这个想法并用一条线代替了20-30线功能.别担心,我确实对自己的头部严厉打击,我应得的. (2认同)
  • put(c)更容易.如果 (2认同)

Sin*_*nür 31

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

puts("hello%");
Run Code Online (Sandbox Code Playgroud)

如果字符串中有格式:

printf("%.2f%%", 53.2);
Run Code Online (Sandbox Code Playgroud)

如评论中所述,puts将a附加\n到输出而fputs不是.

  • 值得一提的是fputs(),因为它直接回复到fprintf(). (4认同)

mar*_*ton 10

与自己...

printf("hello%%"); /* like this */
Run Code Online (Sandbox Code Playgroud)


jld*_*ont 6

使用双%%


pmg*_*pmg 6

Nitpick:
你并没有真正逃避%指定printf()(和scanf())函数族格式的字符串.

%,在printf()(和scanf())系列函数,启动转换规范.转换规范的规则之一规定,%作为转换说明符(紧接%在转换规范开始之后)会导致'%'写入一个字符而不转换参数.

字符串内部确实有2个'%'字符(与转义字符相反:"a\bc"是一个包含3个非空字符"a%%b"的字符串; 是一个包含4个非空字符的字符串).

  • 从技术上讲,它仍在“逃避”;特殊字符需要一种方法来“逃避”其特殊含义并回到其“字符本性” (2认同)

Sal*_*n A 5

像这样:

printf("hello%%");
//-----------^^ inside printf, use two percent signs together
Run Code Online (Sandbox Code Playgroud)


Pan*_*ash 5

您使用的格式说明符不正确。您应该%%用于打印%。你的代码应该是:

printf("hello%%");  
Run Code Online (Sandbox Code Playgroud)

阅读更多C 中使用的所有格式说明符


Don*_*uck 5

您可以使用 %%:

printf("100%%");
Run Code Online (Sandbox Code Playgroud)

结果是:

100%