Skip to content

LV005-字符串简介

一、字符串简介

1. 什么是字符串

在 C 语言中,字符串是一系列 以空字符 \0 结尾字符序列。由于这一特性,字符串可通过字符数组来表示,但字符串并非 C 语言中的独立数据类型。

Tips:在 C 语言中,字符串实际上是使用空字符 \0 结尾的一维字符数组。

2. 怎么确定一个字符串

要想在内存中定位一个字符串,除了要知道它的开头,还要知道它的结尾。

找到字符串的开头很容易,知道它的名字(字符数组名或者字符串名)就可以,但是结尾怎么办呢?在 C 语言 中,字符串总是以 '\0' 作为结尾,所以 '\0' 也被称为 字符串结束标志,或者字符串结束符。由 " " 包围的字符串会自动在末尾添加 '\0' 。例如, "abc123" 从表面看起来只包含了 6 个字符,其实不然, C 语言 会在最后隐式地添加一个 '\0' 。

'\0' 是 ASCII 码 表中的第 0 个字符,英文称为 NULL ,中文称为“空字符”。该字符既不能显示,也没有控制功能,输出该字符不会有任何效果,它在 C 语言 中 唯一 的作用就是作为字符串结束标志。

Tips:在计算字符串长度等相关操作时,'\0' 虽不作为字符串实际内容的一部分参与诸如输出等显示操作,但在确定字符串边界上不可或缺,并且计算字符串长度等相关函数(如 sizeof 等操作)也会将其占用空间计算在内 。

3. 声明一个字符串

下面的声明和初始化创建了一个 hello 字符串。由于在数组的末尾存储了空字符 '\0',所以字符数组的大小比单词 hello 的字符数多一个。

c
char a[6] = {'h', 'e', 'l', 'l', 'o', '\0'};

依据数组初始化规则,可以把上面的语句写成以下语句:

c
char a[6] = { "hello" }

这样声明字符串的时候不需要把 '\0' 字符放在字符串常量的末尾。C 编译器会在初始化数组时,自动把 '\0' 放在字符串的末尾。

4. 与字符数组的关系

字符串字面量(例如 "Hello World!")在 C 语言中会被编译器自动转换为字符数组,并在末尾添加一个 '\0' 作为结束符。例如,当编写:

c
char str[] = "Hello World!";

编译器会分配足够的空间来存储字符 H、e、l、l、o、空格、W、o、r、l、d、! 以及结束符 \0,共计 13 个字符,并将它们存储在 str 数组中。

img
  • 字符数组可存储字符串: 由于字符串以 '\0' 结尾,所以任何以 '\0' 结尾的字符数组均可被视为字符串。
  • 字符串通过字符数组实现: 在 C 语言中,字符串实际上借助字符数组来实现。字符串字面量会被编译器转换为字符数组,并在末尾添加 '\0'。
  • 字符数组不一定存储字符串: 字符数组能够存储任意 char 类型的值,包括非 '\0' 结尾的字符序列,此类数组不能被视为字符串。

5. 怎么访问字符串

5.1 字符数组遍历

前面说了,字符串可以看做是字符数组,那么我们直接 for 循环遍历即可。

5.2 格式占位符 %s

也有简单点的方法,就是在 printf 中使用 %s 格式占位符。前面说了,字符串可以看做是字符数组,那么我们直接 for 循环遍历即可。在 printf 函数中,%s 格式说明符用于输出以 '\0' 结尾的字符串。具体行为如下:

(1)读取规则:printf 会从字符串的首字符开始输出,直到遇到 '\0'(空字符,ASCII 码为 0)时停止。

(2)终止符作用:'\0' 仅作为字符串的结束标志,不会被输出到控制台或缓冲区。

(3)未终止字符串的风险:若字符串未以 '\0' 结尾,printf 可能越界读取内存,导致输出异常(如乱码、含其他数据)或程序崩溃(如段错误)。

6. 内存中是怎么样的

这个其实也没啥说的,就跟字符数组在内存中存储方式一样,即存在于一段连续的内存中。

二、字符串操作函数

这些函数都涉及到指针,这里先简单了解下。在使用字符串处理函数时,要加上头文件 <string.h> 。

c
/* 计算字符串 str 的长度,直到空结束字符,但不包括空结束字符。 */
size_t strlen(const char *str) 
    
/* 把 src 所指向的字符串复制到 dest */
char *strcpy(char *dest, const char *src) 
    
/* 把 src 所指向的字符串追加到 dest 所指向的字符串的结尾。 */
char *strcat(char *dest, const char *src) 

/* 把 str1 所指向的字符串和 str2 所指向的字符串进行比较。 */
int strcmp(const char *str1, const char *str2)

参考资料:

25 字符数组与字符串及多维数组详解:定义与初始化、访问与遍历、%s 格式符、内存剖析、编程实战_多维字符串数组怎么定义-CSDN 博客