字符串在 C 语言中是一个非常重要的概念,它是由一系列字符组成的数组,并且以 \0
(空字符)结尾。C 语言中并没有专门的字符串类型,而是通过字符数组来表示字符串。下面,我将详细讲解关于 C 语言中字符串的基础概念及常用的字符串函数。
在 C 语言中,字符串是以字符数组的形式存储的。字符串的每个字符都是 char
类型,最后会有一个特殊的字符 \0
来标识字符串的结束。
char str[] = "Hello"; // 字符数组定义并初始化为 "Hello"
str
是一个字符数组,内容为 'H'
, 'e'
, 'l'
, 'l'
, 'o'
和结尾的 '\0'
(空字符)。['H', 'e', 'l', 'l', 'o', '\0']
字符串本质上是字符数组,在 C 语言中字符串的操作通常借助字符数组及一些库函数来完成。
C 语言不支持直接将一个字符串赋值给另一个字符串。可以通过使用 strcpy
函数来实现字符串的赋值。
char str1[20];
char str2[] = "Hello, World!";
strcpy(str1, str2); // 将 str2 的内容复制到 str1 中
printf
可以用于输出字符串。scanf
可以用于输入字符串,但有一定的局限性,例如不能读取包含空格的字符串。char str[100];
scanf("%s", str); // 只会读取第一个单词,空格后面的内容会被丢弃
printf("%s\n", str); // 输出字符串
对于包含空格的字符串输入,可以使用 fgets
函数:
fgets(str, 100, stdin); // 读取包含空格的整行
C 语言标准库
提供了很多处理字符串的函数,以下是一些常用的字符串函数:
strlen
- 计算字符串的长度strlen
函数用于计算字符串的长度(不包括结束的 \0
)。
#include
char str[] = "Hello, World!";
int len = strlen(str); // len = 13
strcpy
- 复制字符串strcpy
将一个字符串复制到另一个字符串中,确保目标字符串足够大以容纳源字符串。
char str1[20], str2[] = "Hello!";
strcpy(str1, str2); // 将 str2 的内容复制到 str1 中
strcat
- 连接字符串strcat
用来将两个字符串连接起来。
char str1[20] = "Hello, ";
char str2[] = "World!";
strcat(str1, str2); // str1 现在是 "Hello, World!"
strcmp
- 比较字符串strcmp
用于比较两个字符串。它返回:
char str1[] = "apple", str2[] = "banana";
int result = strcmp(str1, str2); // result < 0 因为 "apple" < "banana"
strchr
- 查找字符strchr
用于查找字符串中第一次出现的某个字符,返回一个指向该字符位置的指针。如果字符不存在,返回 NULL
。
char str[] = "Hello, World!";
char* ptr = strchr(str, 'o'); // ptr 指向第一个 'o' 字符的位置
strstr
- 查找子字符串strstr
用于查找一个字符串是否包含另一个字符串。如果找到,返回指向第一次出现该子字符串的指针,否则返回 NULL
。
char str[] = "Hello, World!";
char* ptr = strstr(str, "World"); // ptr 指向 "World" 字符串的位置
strtok
- 字符串分割strtok
用于分割字符串,按给定的分隔符分割。它每次返回一个分割后的子字符串。
char str[] = "apple,banana,orange";
char* token = strtok(str, ","); // 第一次分割,得到 "apple"
token = strtok(NULL, ","); // 第二次分割,得到 "banana"
\0
:C 语言中的字符串以 \0
(空字符)作为结束标志。字符串的操作函数通常会以 \0
为标识来处理字符串。
字符串操作时需要保证目标字符串数组的大小足够大,避免内存越界。例如,strcpy
需要确保目标数组有足够的空间容纳源字符串及其结束符 \0
。
使用 scanf
时要注意避免缓冲区溢出。为了避免溢出,可以指定输入字符串的最大长度,例如:
scanf("%19s", str); // 限制输入最多 19 个字符,留一个位置给 '\0'
或者使用 fgets
来读取整个行数据,避免溢出:
fgets(str, sizeof(str), stdin); // 读取一整行
\0
:如果字符串没有正确结束(没有 \0
),字符串相关的操作函数可能会导致未定义行为。strcpy
和 strcat
的使用:在使用 strcpy
和 strcat
时,要确保目标数组足够大,以避免缓冲区溢出。\0
作为结尾标志。strcpy
)、连接(strcat
)、比较(strcmp
)、查找字符或子字符串(strchr
和 strstr
)等。