一.字符串
- 字符串的结束标志是\0,所以在计算字符串长度时,一直数到\0之前,不包括\0
- C语言没有原生的字符串类型,但是字符串实际上是字符数组,我们谈论字符串的类型时,通常会说它是char类型的数组。eg.char arr[10]="abcdef",代表char类型的一个数组叫arr
- 里面能放10个元素或者10个字符。
举三个例子:
char arr1[]="abcdef";
char arr2[]={'a','b','c','d','e','f'};
char arr3[]={'a','b','c','d','e','f','\0'};
首先arr1打印出来是abcdef,因为这是字符串,末尾有隐藏的\0
arr2会打印错误,最终打印出来的结果是一堆乱码,直到出现\0,才会停止乱码的打印。原因是用单引号隔开是一个一个的字符,而不是字符串,既然是字符,末尾就没有隐藏的\0,
arr3正确,最终会打印出来abcdef
二.占位符
%c打印字符
%d打印有符号十进制整数
%s打印字符串,遇空格停止读取
%f打印浮点数,小数,float类型的数据
%lf打印浮点数,小数,double类型的数据
%zu(或%zd)是size_t类型
%u打印无符号十进制整数
%%输出一个%
%o八进制输出
%x十六进制输出
%p指针,地址
----------------------------------------%hd:十进制short int类型
%ho:八进制short int类型
%hx:十六进制short int类型
%hu:无符号十进制short int类型,即 unsigned short int
%ld:十进制long int类型
%lo:八进制long int类型
%lx:十六进制long int类型
%lu:无符号十进制long int类型,即: unsigned long int
%lld:十进制long long int类型
%llo:八进制long long int类型
%llx:十六进制long long int类型
%llu:无符号十进制long long int类型,即: unsigned long long int
三.转义字符
重点:
因为转义字符在编程语言中通常被视为字符序列,而不是字符,所以打印时是用双引号字符串的形式打印。
\n代表换行
\'表示转义后打印一个单引号
\"表示转义后打印一个双引号
\\表示转义后打印出来一个\ ,相当于斜杠转义斜杠
\t是水平制表符,相当于Tab键
\a表示报警
\r代表把光标定位到开头,而\n代表换行,他俩的作用加在一起就是enter键
\b是退格键 代表光标回退到前面一个字符,但不删除字符 写法:printf("\b");
三字母词
三字母词 | 对应的字符 |
??= | * |
??( | [ |
??) | ] |
??< | { |
??> | } |
??/ | / |
??! | | |
??' | ^ |
??- | ~ |
也就是说当你想打印出(are you ok??),但是因为存在三字母词,最终打印结果会是(are you ok]
eg.
通过运行结果,可能有人就会有疑问了,为什么跟上述不一致?
那是因为有些编译器不处理三字母词,会将他当做普通字符串来对待
像VS2022和DEVc++,就不会处理三字母词,所以不用再使用转义字符了,更加便捷
当然有一些编译器比如VS2008,这种比较旧的版本可能就容易被解析成三字母词
为什么会有三字母词的出现?
原因是在以前的老式键盘中,类似"{},[],(),|"等符号在当时还都没有,为了解决这个问题,就通过三字母词来替代它
\ddd表示1~3个八进制数字 写法:printf("%c\n",'\ddd');
为什么这个转义字符是要用单引号括起来?
因为:他本质是通过8进制转为10进制后,对应ASCII码中的某一个字符
因为8进制转10进制:0 * 8 ^ 0 + 3 * 8 ^ 1 + 1 * 8 ^ 2 = 88, 而88对应字母X
\xdd(或\xddd)表示1~2(1~3)个16进制数字
计算过程:3*16^0+6*16^1+0*16^2=99,而99对应字母c
练习一下吧~~:
printf("%d\n",strlen("c:\test\628\test.c")); 它的结果是多少?
哪14个?分别是: c : \t e s t \62 8 \t e s t . c 这14个,注意\628不能被看作为是一个转义字符,因为\ddd要求是1~3个八进制(0~7)
写作不易,若有疑问,请各位大佬指点~~感谢