1. 三字母词
在C语言中有一种三字母词的说法,trigraph sequences,目前为止有九种三字母词,如下
??= # ??) ] ??! |
??( [ ??' ^ ??> }
??/ \ ??< { ??- ~
三字母词出现的原因是,为了避免以前的老式键盘中没有上面的九种字符
这里还需要注意的是,在用gcc编译时可能会出现如下错误
在编译时如果不加-trigraphs会出现如下警告
warning: trigraph ??/ ignored, use -trigraphs to enable
我们需要在编译时加上-trigraphs选项,而且需要加在最前面。
cc -trigraphs -o test test.c
这里我们需要注意的一点就是,当我们看到两个问号同时出现时,就留意一下三字母词,避免引起不必要的麻烦,防止出现三字母词,即想打印出两个问号时,就使用\?
2. 转义字符
我们在编写C程序的时候,会想要打印出某些符号,但是因为这些符号是有特殊含义的,所以经常不能如愿,接下来就是转义字符了
转义字符(escape sequence)由一个反斜杠\加上一个或多个其他字符组成。
\?在书写连续多个问号时使用,防止它们被解释为三字母词。
\"用于表示一个字符串常量内部的双引号。
\'用于表示字符常量‘。
\\用于表示一个反斜杠,防止它被解释为一个转义序列符。
\a | 警告字符。 |
\b | 退格键 |
\f | 进纸字符 |
\n | 换行符 |
\r | 回车符 |
\t | 水平制表符 |
\v | 水平制表符 |
\ddd | ddd表示1~3个八进制数字,表示八进制所对应的十进制数对应ASCII对应的字符。 |
\xddd | 与上例类似,只是八进制数换成了十六进制数 |
3.小例题
这里我们来看一道题目
len = strlen("c:\code\test\ten.c");
这个时候len的结果是15,因为\为当成是一个转义字符的标识,所以这里\c和\t被分别当成是一个字符
变式1:len = strlen("c:\\code\\test\\ten.c");
结果是18,这里\\被当成是一个字符,表示一个\,而c和t就被当成是一个字符
变式2:len = strlen("c:\\code\\test\\ten.c\123");
结果是19,因为后面的\123,是上文中转义字符的一种,表示123八进制所对应的十进制数对应的asall码多对应的字符
变式3:len = strlen("c:\\code\\test\\ten.c\023");
这里的结果是还是19,题目没有把\0作为结束的标识
变式4:len = strlen("c:\\code\\test\\0ten.c\023");
这里的结果是12,因为\0在这里被当成是结束的字符串标识,并且不被strlen统计成一个字符