LINUX学习之《转换说明和转义序列》
有一道习题:在printf的格式化字符串中怎么表示一个%字符?我们留在后面解决。
关于转义字符:
例如:\和%
其意思是将反斜杠\或百分号%后面的字符转变成为另外的意义。
关于转义序列:
在格式化字符串中(eg:printf(“ character: %c\n integer: %d\n floating point: %f\n”,'{', 34, 3.14); 中的“”部分),\号后面加上字母n表示换行意义的转移序列。
转义序列 |
意义 |
ASCII码值(十进制) |
\a |
响铃(BEL) |
007 |
\b |
退格(BS) ,将当前位置移到前一列 |
008 |
\f |
换页(FF),将当前位置移到下页开头 |
012 |
\n |
换行(LF) ,将当前位置移到下一行开头 |
010 |
\r |
回车(CR) ,将当前位置移到本行开头 |
013 |
\t |
水平制表(HT) (跳到下一个TAB位置) |
009 |
\v |
垂直制表(VT) |
011 |
\\ |
代表一个反斜线字符''\' |
092 |
\' |
代表一个单引号(撇号)字符 |
039 |
\" |
代表一个双引号字符 |
034 |
\? | 代表一个问号 | 063 |
\0 |
空字符(NUL) |
000 |
\ddd |
1到3位八进制数所代表的任意字符 |
三位八进制 |
\xhh |
十六进制所代表的任意字符 |
十六进制 |
关于转换说明:
在格式化字符串中(eg:printf(“ character: %c\n integer: %d\n floating point: %f\n”,'{', 34, 3.14); 中的“”部分),%号后面加上字母c、d、f分别表示字符型、整型和浮点型的转换说明,转换说明只在格式化字符串中占个位置,并不出现在最终的打印结果中,这种用法通常叫做占位符。
转换说明 |
意义 |
|
%a(%A) |
浮点数、十六进制数字和p-(P-)记数bai法(C99) |
|
%c |
字符 |
|
%d | 有符号十进制整数 | |
%f | 浮点数(包括float和doulbe) | |
%e(%E) | 浮点数指数输出[e-(E-)记数法] | |
%g(%G) | 浮点数不显无意义的零"0" | |
%i | 有符号十进制整数(与%d相同) | |
%u | 无符号十进制整数 | |
%o | 八进制整数 e.g. 0123 | |
%x(%X) | 十六进制整数0f(0F) e.g. 0x1234 | |
%p | 指针 | |
%s | 字符串 | |
%% | % |
转义序列与转换说明的一些区别:
- 转义序列是在编译时处理的,而转换说明是在运行时调用printf函数处理的。
源文件中的字符串字面值是“ character: %c\n integer: %d\n floating point: %f\n” ,\n占两个字符,而编译之后保存在可执行文件的字符串中\n已经被替换成一个换行符,而%c等不变,然后在运行时这个字符串被传给printf,printf再把其中的%c、%d、%f解释成转换说明。
有时候不同类型的数据很容易弄混,例如:“5”、‘ 5 ’ 、5 。如果你注意了它们的界定符就会很清楚,第一个是字符串字面值;第二个是字符;第三个是整数。
再来看看这道习题:在printf的格式化字符串中怎么表示一个%字符?
答:只需要重复百分号:%%。
#include <stdio.h>
int main()
{
printf("%%/n");
return 0;
}
用printf输出%之所以困难是因为%正是printf的转义字符。任何时候printf遇到%,它都会等待下一个字符,然后决定如何处理。而双字符序列%%就被定义成了单独的%字符。
要理解为什么\%不行,得知道反斜杠\是编译器的转义字符,它控制编译器在编译时对源代码中字符的解释。而这里我们的问题是printf如何在运行时(因为是要打印出%)控制它的格式串。在编译器看来,\%可能没有定义或者代表一个%字符。就算printf会对\特殊处理,\和%在printf中都有效的可能性也不大。
参考资料链接:
https://book.51cto.com/art/200901/106878.htm
https://baike.baidu.com/item/转义序列/2482443
本文地址:https://blog.csdn.net/weixin_44189360/article/details/107303278