一、字符串、\0 和 转义字符
1. 字符
使⽤双引号括起来的⼀串字符就被称为字符串,如:“abcdef”,就是⼀个字符串。
字符串的打印格式可以使⽤ %s
来指定,也可以直接打印如下:
#include <stdio.h> int main() { printf("%s\n", "hello C"); printf("hello c"); return 0; }
1.2. \0
C语⾔字符串里⼀个小知识,就是在字符串的末尾隐藏放着⼀个 \0
字符,而这个\0
字符是字符串的结束标志。
对于字符串"abcdef",我们实际上看到了6个字符:a,b,c,d,e,f,但是实际上在末尾还隐藏⼀个 \0 的转义字符, \0 是字符串的结束标志。所以我们在使⽤库函数 printf() 打印字符串或者strlen() 计算字符串⻓度的时候,遇到 \0 的时候就⾃动停⽌了。
当然,我们可以来验证一下,C语⾔中也可以把⼀个字符串放在⼀个字符数组中,我们在这⾥利⽤下⾯的代码验证⼀下 \0 的功能。
#include <stdio.h> int main() { char arr1[] = {'a', 'b', 'c'};//arr1数组中存放3个字符 char arr2[] = "abc"; //arr2数组中存放字符串 printf("%s\n", arr1); printf("%s\n", arr2); return 0; }
这样的代码,我调试的时候,观察⼀下 arr1
和 arr2
的内容:
运行结果:
此时,我们可以看到经典 烫烫, arr1 字符数组在打印的时候,打印了 a 、 b 、 c 后还打印了⼀些随机值,这就是因为 arr1 在末尾的地⽅没有 \0` 字符作为结束标志,在打印的时候没有停⽌。
但是 arr2 的打印就是完全正常的,就是因为 arr2 数组是使⽤字符串常量初始化的,数组中有 \0 作为技术标志,打印可以正常停⽌。
哎!分析后,如果我们在arr1数组中单独放⼀个 ‘\0
’ 字符又会怎么样呢?
#include <stdio.h> int main() { char arr1[] = {'a', 'b', 'c', '\0'}; char arr2[] = "abc"; printf("%s\n", arr1); printf("%s\n", arr2); printf("%s\n", "abc\0def"); return 0; }
运行结果:
看到三次打印的结果是⼀样的了,都是打印到 \0
的时候就停⽌了,那从上述的例⼦我们确实能够观察到 \0
的作⽤和重要性的。
1.3 转义字符
当你看到这里,你会或许在前⾯的代码中,你看到 \n
, \0
会很纳闷这些都是啥。其实在字符中有⼀组特殊的字符是转义字符,转义字符顾名思义:转变原来的意思的字符。
例如:我们有一个字符 n,当我们在字符串中打印时,它自然会被打印出来。如下:
#include <stdio.h> int main() { printf("abcndef"); return 0; }
输出的结果:
如果我们修改⼀下代码,在 n 的前⾯加上 \ ,变成如下代码:
#include <stdio.h> int main() { printf("abc\ndef"); return 0; }
输出结果:
我们可以看到修改的前后代码输出的结果,截然不同的,那这是为什么呢?
这就是转义字符的问题, \n
是⼀个转义字符表⽰换⾏的意思,我们可以简单的理解为 \ 让 n 的意思发⽣了转变, n 本来是⼀个普通的字符,被 \ 转义为换⾏的意思。
C语⾔中像这样的转义字符还有⼀些,具体如下:
• \? :在书写连续多个问号时使⽤,防⽌他们被解析成三字⺟词,在新的编译器上没法验证了。
• \' :⽤于表⽰字符常量’
•\" :⽤于表⽰⼀个字符串内部的双引号
• \\ :⽤于表⽰⼀个反斜杠,防⽌它被解释为⼀个转义序列符。
• \a :警报,这会使得终端发出警报声或出现闪烁,或者两者同时发⽣。
• \b :退格键,光标回退⼀个字符,但不删除字符。
• \f :换⻚符,光标移到下⼀⻚。在现代系统上,这已经反映不出来了,⾏为改成类似于 \v 。
• \n :换⾏符。
• \r :回⻋符,光标移到同⼀⾏的开头。
• \t :制表符,光标移到下⼀个⽔平制表位,通常是下⼀个8的倍数。
• \v :垂直分隔符,光标移到下⼀个垂直制表位,通常是下⼀⾏的同⼀列。
【C语言】第三回 关于字符串,语句和注释的使用2:https://developer.aliyun.com/article/1474596