为什么在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");