如果我putchar('\\t');
在尝试打印"\t"
而不是实际选项卡时写,我会收到多字符常量警告。另一方面,如果我写,putchar('\\');
我不会收到任何警告。在 ASCII 表中查看,没有字符'\\'
,只有'\'
. 那么为什么没有警告呢?为什么'\\'
一个字符但'\\t'
不止一个?反斜杠只能用于转义后面的一个字符吗?
2 回答
您不能使用一次调用打印\
和,因为将一个且仅一个字符放入标准输出中。使用2:t
putchar
putchar
putchar('\\');
putchar('t');
另一种选择是将字符串 "\\t"
与fputs
:
fputs("\\t", stdout);
没有警告,'\\'
因为这是您输入字符文字的一种方式\
。在 ASCII 上,这与'\134'
和同义'\x5c'
。
从C11 6.4.4.4第 2 和 4 段:
2
整数字符常量是包含在单引号中的一个或多个多字节字符的序列,如
'x'
. [...] 除了稍后详述的少数例外,序列的元素是源字符集的任何成员;它们以实现定义的方式映射到执行字符集的成员。[...]
4
双引号
"
和问号?
可以分别由它们本身或转义序列\"
and表示\?
,但单引号'
和反斜杠\
应分别由转义序列\'
and表示\\
。
您收到警告的原因是该行为完全由实现定义。在C11 J.3.4中,以下列为实现定义的行为:
包含多个字符或包含不映射到单字节执行字符的字符或转义序列的整数字符常量的值 (6.4.4.4)。
由于'\\'
包含映射到单字节执行字符的转义序列\
,因此没有实现定义的陷阱,也无需警告;但\\t
包含 2 个字符:\
和t
,它不会做你想要的便携。
\\
是一个字符,t
是一个字符,所以这显然是两个字符。
\\
是一个转义序列,就像\t
; 这意味着\
。
如果您想打印两个字符\
and t
,您显然需要两次调用putch()
或一个接受字符串参数的函数"\\t"
。
https://en.wikipedia.org/wiki/Escape_sequences_in_C#Table_of_escape_sequences