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

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值