前言
字符串(character string)是一个或多个字符的序列,很多高级语言像 java、C#、Kotlin 都有字符串类型,但是 C 语言并没有提供符串数据类型,而是使用 char 类型的数组元素来存储字符串。
在 C 语言中定义字符串有下列几种形式:
- 字符串常量;
- char 数组;
- char 指针。
一、字符串常量
字符串常量的例子非常常见,它是放在一对双括号中的一串字符或符号。一对双括号之间的任何内容都会被编译器视为字符串,包括特殊字符和嵌入的空格。当使用 printf() 显示信息时,就将该信息定义为字符串常量了,看以下示例:
printf("This is a string.");
printf("This is on\ntwo lines.");
printf("Foor \" you write \\\".");
执行结果如下:
This is a string.
This is on
two lines.
For " you write \".
使用特殊字符时要注意转义字符“\”的用法。下面来看字符串常量在内存中的存储形式,如下图所示:
每个字符串的末尾都自动添加了代码值为 0 的特殊字符,这个字符称为空字符,写为 \0。C 中的字符串总是由 \0 字符结束,因此字符串的长度要比字符串中的字符数多 1。
要注意的是,在 printf() 函数遇到第一个空字符 \0 时就会停止输出。
二、存储字符串的变量
C 语言对变量存储字符串的语法没有特殊的规定,而且 C 中根本就没有 字符串变量,也没有处理字符串的特殊运算符,但是标准库中提供了很多函数来处理字符串。
2.1 char 数组
可以使用 char 数组来保存字符串,这也是字符串变量的最简单的形式,char 数组的声明如下:
char exp[32];
该变量可以存储一个最多包含 31 个字符的字符串,因为要预留一个数组元素给终止符“\0”。
注意:如果使用这个数组来存储 32 个字符(数组末位不是终止符),那么以上的 char 数组就不是表示一个字符串了,仅仅是一个 char 数组而已。
看另一种声明方式,这里使用以下声明初始化字符串变量:
char exp[] = "This is a string.";
这里并没有指定数组大小,编译器会指定一个足以容纳这个初始化字符串常量的数值。在上例中数组大小为 18,其中前 17 个元素用来存储字符,最后一个用来存储终止符“\0”。
要引用存储在数组中的字符串,只需要使用数组名即可,例如使用 printf 函数输出存储在数组中的字符串,%s 用于输出一个用空字符中止的字符串:
printf("the content of the array is %s\n", standard);
三、字符指针
可以通过指针来表示字符串,一般形式如下:
char* string = "This is a string.";
这里有一点要注意:可以对上面的 string 整体赋值,但是不能修改字符串中的任一字符,否则会提示访问冲突。例如:
string++; string = 'y';
string[1] = 'e';
在这段代码中,string 本质上是一个字符指针,占 4 字节;"This is a string." 分配在代码段,占 18 个字节;实际上总共耗费了 22 个字节,这 22 个字节中:4 字节的指针 string 叫做字符串指针(用来指向字符串的,但是它本身不是字符串),17 字节的用来存 "This is a string" 这 17 个字符的内存才是真正的字符串,最后一个用来存 '\0' 的内存是字符串结尾标志(本质上也不属于字符串)。
四、字符串常用的方法
请参考 C 在线手册:http://www.kuqin.com/clib/
五、总结
C 语言中字符串的本质:指针指向头、固定尾部的地址相连的一段内存。
字符串就是一串字符。字符反映在现实中就是文字、符号、数字等人用来表达的字符,反映在编程中字符就是字符类型的变量。C 语言中使用 ASCII 编码对字符进行编程,编码后可以用 char 型变量来表示一个字符。字符串就是多个字符打包在一起共同组成的;
字符串在内存中其实就是多个字节连续分布构成的(类似于数组,字符串和字符数组非常像);
C 语言中字符串有 3 个核心要点:
- 第一是用一个指针指向字符串头;
- 第二是固定尾部(字符串总是以'\0'来结尾);
- 第三是组成字符串的各字符彼此地址相连。
'\0' 是一个 ASCII 字符,其实就是编码为 0 的那个字符(真正的 0,和数字 0 是不同的,数字 0 有它自己的 ASCII编码)。要注意区分 '\0' 和 '0' 和 0;
'\0' 作为一个特殊的数字被字符串定义为结尾标志。产生的副作用就是:字符串中无法包含 '\0' 这个字符。