c中关于转义字符!!

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c中关于转义字符!!相关的知识,希望对你有一定的参考价值。

我对转义字符的合法性一直很模糊,有点疑问,希望能帮忙解决一下,
\154, \0xab ,\ab.都表示啥意思啊?是否都合法,对于\0xab这个16进制的字符转化为十进制咋转的(给点过程)?

转义字符是C语言中表示字符的一种特殊形式。通常使用转义字符表示ASCII码字符集中不可打印的控制字符和特定功能的字符,如用于表示字符常量的单撇号( '),用于表示字符串常量的双撇号( ")和反斜杠( \)等。转义字符用反斜杠\后面跟一个字符或一个八进制或十六进制数表示。

转义字符 意义 ASCII码值(十进制)
\a 响铃(BEL) 007
\b 退格(BS) 008
\f 换页(FF) 012
\n 换行(LF) 010
\r 回车(CR) 013
\t 水平制表(HT) 009
\v 垂直制表(VT) 011
\\ 反斜杠 092
\? 问号字符 063
\' 单引号字符 039
\" 双引号字符 034
\0 空字符(NULL) 000
\ddd 任意字符 三位八进制
\xhh 任意字符 二位十六进制

字符常量中使用单引号和反斜杠以及字符常量中使用双引号和反斜杠时,都必须使用转义字符表示,即在这些字符前加上反斜杠。
在C程序中使用转义字符\ d d d或者\ x h h可以方便灵活地表示任意字符。\ d d d为斜杠后面跟三位八进制数,该三位八进制数的值即为对应的八进制A S C I I码值。\ x后面跟两位十六进制数,该两位十六进制数为对应字符的十六进制A S C I I码值。

使用转义字符时需要注意以下问题:
1) 转义字符中只能使用小写字母,每个转义字符只能看作一个字符。
2) \v 垂直制表和\f 换页符对屏幕没有任何影响,但会影响打印机执行响应操作。
3) 在C程序中,使用不可打印字符时,通常用转义字符表示。
4)\n其实应该叫回车换行。换行只是换一行,不改变光标的横坐标;回车只是回到行首,不改变光标的纵坐标。
5)\t 光标向前移动四格或八格,可以在编译器里设置。
6)\' 在字符里(即单引号里)使用。在字符串里(即双引号里)不需要,只要用 ' 即可。
7)\? 其实不必要。只要用 ? 就可以了(在windows VC6 和tc2 中验证)。
参考技术A \154
是用三位八进制数表示的转义字符,实际上,它所表示的就是ASCII值十进制为188(八进制就是154)的字符l

\0xab和\ab都不是转义字符,十六进制的转义字符是以\x开头后面跟上十六进制数字构成的,而不是\x0开头的
参考技术B 下一本C标准来看,如ISO:IEC C99,里面关于C的一切都清清楚楚的了 参考技术C 10进制:123 = 1*10*10 + 2*10 + 3
16进制:123 = 1*16*16 + 2*16 + 3

0xab = 10*16+11 = 171本回答被提问者采纳

C/C++中关于宏定义中使用 # 和 ## 的作用

最近在阅读redis源码,遇到这样的宏定义代码#define __str(s) #s,在以前并没有看到过这样的宏定义方式,因此就查阅资料对此类特殊的宏定义进行一个总结。

’ # ’ 在宏定义中的使用

  1. 将参数设置转换为字符串,即给参数的加上 " " ;
#include<stdio.h>
#define __str(s) #s

int main(){
	char *str = __str(hello world!);
	printf("%s\\n",str);
	return 0;
}

上述代码将会打印出 hello world!

’ ## '在宏定义中的使用

’ ## '的作用便是将两个参数连接在一起,而这种连接就是直接将这两个参数拼接成一个整体,比如 整型12 和整型 14 拼接在一起则形成整型数据 1214,同样也可以拼接成double类型或者字符串类型。

#include<stdio.h>

#define __str(s) #s
#define __connect(a, b) a##b

int main() {
	int a = __connect(12,14);
	double b = __connect(14.1,23);
	const char* str = __connect("hello", "world");

	printf("%s\\n%d\\n%lf\\n", str, a, b);
	return 0;
}

上述代码将会打如下打印:

防止嵌套宏不会展开的情况

当我们在宏定义中使用了 # 或者 ## 的时候就会发现某些时候当我们嵌套的使用宏定义时,内层的宏定义并不会被展开。如下代码:

#include<stdio.h>


#define __str(s) #s
#define __connect(a, b) a##b
#define __sum(a, b) (a)+(b)

int main() {
	const char* str = __str(__sum(1,2));
	printf("%s\\n",str);
	return 0;
}

上述代码中我们将会的到这用的结果

如果我们想要将内层的宏定义__sum(1, 2)展开,那么我们定义两次宏,在redis源码中是这样的:

/* Double expansion needed for stringification of macro values. */
#define __xstr(s) __str(s)
#define __str(s) #s

整合到我上述的代码中:

#include<stdio.h>

#define __xstr(s) __str(s)
#define __str(s) #s
#define __connect(a, b) a##b
#define __sum(a, b) (a)+(b)

int main() {
	int res = __sum(1, 2);
	const char* str = __xstr(__sum(1,2));
	printf("%s\\n",str);
	return 0;
}

此时的运行结果将会是我们想要的结果。

以上是关于c中关于转义字符!!的主要内容,如果未能解决你的问题,请参考以下文章

c语言中不按转义字符处理是啥意思

php mysql转义特殊字符的函数都有哪些

C语言——转义字符

C语言转义字符基础总结

关于c语言 转义字符的退格

C++中如何禁止转义字符转义?比如"C:\node"代表一个在C盘下的node文件夹。