为什么在C中百分比字符不能用反斜杠转义?

为什么在C中百分比字符不能用反斜杠转义?,c,escaping,printf,special-characters,C,Escaping,Printf,Special Characters,printf()文档说明,如果有人想用C打印%,他可以使用: printf("%%") 为什么不是: printf("\%") 与其他特殊字符一样?,因为%由printf处理。它在C语言中不是一个特殊字符,但printf本身对它的处理方式不同。在解释程序的源文本时,反斜杠由编译器处理。因此,常见的结果是源文本“\%”生成一个包含“%”的字符串 格式字符串由printf例程解释,因此它处理传递给它的字符。此时,反斜杠不再存在,因此printf永远看不到它 从技术上讲,\%在字符串文本中是不合法

printf()
文档说明,如果有人想用C打印
%
,他可以使用:

printf("%%")
为什么不是:

printf("\%")

与其他特殊字符一样?

,因为
%
printf
处理。它在C语言中不是一个特殊字符,但printf本身对它的处理方式不同。

在解释程序的源文本时,反斜杠由编译器处理。因此,常见的结果是源文本
“\%”
生成一个包含“%”的字符串

格式字符串由
printf
例程解释,因此它处理传递给它的字符。此时,反斜杠不再存在,因此
printf
永远看不到它

从技术上讲,
\%
在字符串文本中是不合法的。字符
\
开始一个转义序列,C 2011 6.4.4.4 1中列出了唯一合法的转义序列。它们是
\
,后面是
'
a
b
f
n
r
t
v
,一到三个八进制数字,
x
和十六进制数字,
u
和四个十六进制数字,或
u
和八个十六进制数字

如果
printf
的设计使反斜杠转义为百分比,则必须通过转义源文本中的反斜杠来传递反斜杠,因此必须编写:

printf("\\%");

传统的做法是特殊角色逃避自己。因此,它不使用反斜杠来转义百分比,而是自行转义。(请注意,要将反斜杠传递给
printf
,您必须将字符串文字写为
“\\%”

您可以这样做

#include <iostream>
#include <string>
#include "stdio.h"
using namespace std;



int main(int argc, char **argv)
{


    printf("hhhhhhh %s \n","\%");
    printf("hhhhhhh  \n");

    return 0;
}
别走。但是如果你使用

printf(" xxxxxx  %s  xx %s \n","\0x81","\0x82"); 

你说得对。A plus

有关更多信息,请查看此链接;这就是printf的方式。对于“x和十六进制数字”的谨慎措辞,我宁愿使用这个参考+1。编译器和printf对
`和
%`使用的约定是这些字符自行转义。字符串文字和字符中的约定是使用反斜杠转义结束分隔符。就我个人而言,我认为最好让转义字符的转义表示是该字符后跟特定的其他内容;并避免使用与其他内容类似的转义符,但将转义字符和前面的内容(如带转义符的引号)加倍(而不是使用例如
\q
作为转义引号)的想法似乎很常见。在字符串和字符文字中,这也适用,反斜杠是元字符,它本身会转义;在大多数语言中,引号字符不会自动转义,而是使用反斜杠。我想你同意我的意见了?有一些奇怪的方案,其中使用双引号来表示文字引号(UTR35就是一个例子,这是一个真正的噩梦)。双元字符来表示自己是一种常见的模式,尽管我不知道它除了受欢迎之外还有什么真正的优势,因为它意味着一个人不能知道一个特定的字符意味着什么,而不能看到前面任意数量的字符。具有
`be
\!`可以避免字符串以
结尾的含义不明确[引号是否是字符串的转义部分?]其他语言使用一些不同的方法,尽管有时它们会产生自己的歧义(例如,网络格式字符串)。
printf(" xxxxxx  %s  xx %s \n","\0x81","\0x82");