为什么在C中没有使用反斜杠转义百分比字符?

时间:2013-07-23 13:26:06

标签: c escaping printf special-characters

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

printf("%%")

为什么不是:

printf("\%")

与其他特殊字符一样吗?

4 个答案:

答案 0 :(得分:38)

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

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

从技术上讲,\%在字符串文字中是不合法的。字符\启动转义序列,唯一的合法转义序列列在C 2011 6.4.4.4中。它们是\后跟'",{ {1}},?\abfnr,{{1 ,一到三个八进制数字,t和十六进制数字,v和四个十六进制数字,或x和八个十六进制数字。

如果u被设计成反斜杠会逃逸一个百分比,那么你必须通过转义源文本中的反斜杠来传递一个反斜杠,所以你必须写:

U

答案 1 :(得分:29)

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

答案 2 :(得分:4)

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

答案 3 :(得分: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与两个转义序列一起使用

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

不要去。但是如果你使用

printf(" xxxxxx  %s  xx %s \n","\0x81","\0x82"); 
你是对的。加号