2013-07-23 58 views
17

printf()文档中说,如果有人想用C打印%,他可以使用:为什么百分比字符不能在C中用反斜线转义?

printf("%%") 

为什么不:

printf("\%") 

与其他特殊字符?

+1

查看此链接了解更多信息; http://publib.boulder.ibm.com/infocenter/pseries/v5r3/index.jsp?topic=/com.ibm.aix.cmds/doc/aixcmds4/printf.htm – JNL

+1

这只是printf的方式。我宁愿使用这个参考文献http://www.cplusplus.com/reference/cstdio/printf/ – GreenScape

回答

28

因为%printf处理。这不是C中的特殊字符,但printf本身对待它的方式不同。

35

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

格式字符串由printf例程解释,因此它会处理传递给它的字符。到目前为止,反斜杠不再存在,所以printf从来没有看到它。

从技术上讲,\%在字符串文字中不合法。字符\开始一个转义序列,并唯一合法转义序列在C中所列2011 6.4.4.4 1.他们是\其次是'"?\abfnrtv ,一到三个八进制数字,x和十六进制数字,u和四个十六进制数字,或U和八个十六进制数字。

如果printf已被设计成一个反斜杠会逃出%,那么你就必须通过转义源文本反斜杠传递给它一个反斜杠,所以你会写:

printf("\\%"); 
+1

+1来仔细地写下“x和十六进制数字”http:// stackoverflow。com/questions/5784969/when-did-c-compilers-start-consideration-more-two-hex-digits-in-string-lite – chux

3

惯例是特殊字符自己逃脱。因此,它不是使用反斜杠来逃避百分比,而是逃避自己。 (请注意,要将反斜杠传递到printf,您必须将字符串文字写为"\\%"。)

+0

由编译器和'%'通过printf使用的约定是那些角色逃脱了自己。字符串文字和字符中的约定是反斜杠用于转义结尾分隔符。就我个人而言,我认为最好将转义字符的转义表示形式表示为该字符后面跟着特定的*其他*;并避免使其看起来像其他事物一样,但将加倍转义字符和前面的东西(如带有转义引号的引号)(而不是像使用'\ q'作为转义引用)这样的想法看起来很常见。 – supercat

+0

在字符串和字符文字中这也适用,反斜杠是元字符,并且它自己逃脱;在大多数语言中,引号字符不会自行逃脱,而是使用反斜杠。我认为你同意我的观点?有一些奇怪的方案使用双引号来表示文字引号(UTR35作为一个例子来思考,这是一个真正的噩梦)。 –

+0

将元字符加倍以表示自己是一种常见模式,但除了受欢迎程度之外,我不知道它有任何真正的优势,因为它意味着无法知道某个特定字符的含义,而不能看到任意数量的字符它。把'\'的转义表示成'\!'将避免含糊不清似乎以'\\\\\\\''结尾的字符串[引号是否是字符串的转义部分? ]其他语言使用一些不同的方法,虽然有时它们会产生他们自己的歧义(例如.NET格式字符串)。 – supercat

0

您可以这样做!!!!!

#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的存在,从您使用编译器.. 随着wxWidget不同LIB你不能有两个转义序列

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

唐吨去用printf。但如果你使用

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

你是对的。 A plus

相关问题