在C语言中,string 这个词通常有两种含义,理解它们的区别非常重要:

(图片来源网络,侵删)
- 核心含义:字符串的概念
- 标准库类型:
string.h中的函数和操作
下面我将详细解释这两种含义。
核心含义:字符串的概念
在C语言中,字符串 本质上是一个字符数组,它用于表示文本,但与普通字符数组不同的是,字符串必须以一个特殊的字符结尾,这个字符就是 '\0' (空字符,其ASCII码值为0)。
关键点:
- 字符数组:
char类型的数组。 - 结尾标志:最后一个字符必须是
'\0',这个标志告诉程序,字符串在这里结束了。 - 长度:字符串的长度是其字符的数量(不包括结尾的
'\0')。"hello"有5个字符,但在内存中它实际需要6个字节的空间来存储'h', 'e', 'l', 'l', 'o', '\0'。
字符串的两种常见表示形式:
a) 字符串字面量 (String Literal)

(图片来源网络,侵删)
这是在代码中直接写出的字符串,用双引号 括起来。
char greeting[] = "Hello, World!";
当你写下 "Hello, World!" 时,编译器会自动在末尾添加 '\0'。greeting 数组在内存中的实际内容是:
'H', 'e', 'l', 'l', 'o', ',', ' ', 'W', 'o', 'r', 'l', 'd', '!', '\0'
b) 字符数组
你可以手动初始化一个字符数组来构成字符串,但必须手动添加 '\0'。
char name[5] = {'J', 'o', 'h', 'n', '\0'}; // 正确,是一个有效的字符串
char name_bad[5] = {'J', 'o', 'h', 'n'}; // 错误!这不是一个有效的字符串,因为它缺少结尾的 '\0',这会导致很多函数(如 `printf`, `strlen`)无法正确工作。
重要区别:
char greeting[] = "Hello";// 数组大小自动确定为6(包括'\0')char name[5] = "John";// 数组大小是5,刚好够J','o','h','n','\0'char name[10] = "John";// 数组大小是10,后面的空间是空的,但'\0'仍然在n之后。
标准库类型:string.h 中的函数和操作
C语言本身没有内置的 string 数据类型(像C++中的 std::string),所有对字符串的操作都是通过一个名为 <string.h> 的标准头文件中的函数来完成的。
当你听到别人说 "C语言的string函数",他们指的就是这个头文件里的函数集合。
常用的 <string.h> 函数:
| 函数 | 功能 | 示例 |
|---|---|---|
strlen(s) |
计算字符串 s 的长度(不包括 '\0')。 |
len = strlen("hello"); // len 的值是 5 |
strcpy(dest, src) |
将字符串 src 复制到 dest。注意:dest 必须有足够的空间! |
strcpy(buffer, "text"); |
strcat(dest, src) |
将字符串 src 追加到 dest 的末尾。注意:dest 必须有足够的空间! |
strcat(buffer, " more"); |
strcmp(s1, s2) |
比较两个字符串。s1 == s2,返回0;s1 < s2,返回负数;s1 > s2,返回正数。 |
if (strcmp(name, "admin") == 0) { ... } |
strncpy(dest, src, n) |
安全版本的 strcpy,最多复制 n 个字符。 |
strncpy(buffer, "a very long string", 5); // 只复制 "a ve" |
strncat(dest, src, n) |
安全版本的 strcat,最多追加 n 个字符。 |
strncat(buffer, "end", 3); |
strchr(s, c) |
在字符串 s 中查找字符 c 首次出现的位置。 |
ptr = strchr("hello", 'l'); // ptr 指向第二个 'l' |
strstr(s1, s2) |
在字符串 s1 中查找子字符串 s2 首次出现的位置。 |
ptr = strstr("hello world", "world"); // ptr 指向 "world" |
使用示例:
#include <stdio.h>
#include <string.h> // 必须包含这个头文件才能使用字符串函数
int main() {
char str1[50] = "Hello";
char str2[] = ", World!";
int len;
// 1. 使用 strlen 获取长度
len = strlen(str1);
printf("Length of str1: %d\n", len); // 输出: Length of str1: 5
// 2. 使用 strcat 连接字符串
// 注意:str1 必须有足够的空间来容纳连接后的结果
strcat(str1, str2);
printf("After concatenation: %s\n", str1); // 输出: After concatenation: Hello, World!
// 3. 使用 strcpy 复制字符串
char str3[50];
strcpy(str3, str1);
printf("Copied string: %s\n", str3); // 输出: Copied string: Hello, World!
// 4. 使用 strcmp 比较字符串
if (strcmp(str1, str3) == 0) {
printf("str1 and str3 are the same.\n");
} else {
printf("str1 and str3 are different.\n");
}
return 0;
}
| 含义 | 解释 | 关键点 |
|---|---|---|
| 字符串概念 | C语言中用于表示文本的数据结构,本质是以 '\0' 结尾的字符数组。 |
'\0' 是必须的! 这是字符串和普通字符数组的根本区别。 |
string.h 库 |
C标准库中提供的一系列用于操作字符串的函数集合。 | C语言没有内置的 string 类型,所有操作都依赖这个库,使用时必须 #include <string.h>。 |
string是一个概念:以'\0'结尾的字符数组。<string.h>是一个工具箱:里面装满了处理这个概念的函数(如strlen,strcpy等)。
