C 语言字符串
在 C 编程语言中,字符串是由一系列字符组成的字符数组。字符串是以 空字符
\0
结尾的,以此标志字符串的结束。
1. 字符串的定义与表示
1.1 字符串定义
在 C 语言中,字符串是通过字符数组来定义的。定义字符串的一种常见方式是使用字符数组,数组的大小需要至少能容纳所有字符和一个结尾的空字符 \0
。
char str[6] = "Hello"; // 包括 '\0' 结尾字符
在这个例子中,str
数组有 6 个元素,分别是 H, e, l, l, o, \0
。
1.2 字符串初始化
初始化字符串时,可以直接赋值:
char str[] = "Hello"; // 自动分配 6 个字符大小
C 编译器会自动根据字符串内容计算数组的大小,因此 str
实际上是一个包含 6 个字符的数组:H, e, l, l, o, \0
。
2. 字符串的内存布局
C 字符串的内存中包括字符数组及结尾的空字符 \0
。例如:
char str[] = "C Program";
内存布局为:
C | 空格 | P | r | o | g | r | a | m | \0 |
---|---|---|---|---|---|---|---|---|---|
67 | 0 | 80 | 114 | 111 | 103 | 114 | 97 | 109 | 0 |
这里 C
的 ASCII 值是 67,P
是 80,以此类推,最后是空字符 \0
,它表示字符串的结束。
3. 常见字符串操作函数
在 C 中,标准库提供了一些常见的字符串操作函数,主要包括 <string.h>
头文件中的函数。
3.1 strlen()
strlen()
用于计算字符串的长度(不包括 \0
)。
#include <string.h>size_t len = strlen("Hello"); // 返回 5
3.2 strcpy()
strcpy()
用于将一个字符串拷贝到另一个字符串。
#include <string.h>char dest[10];
strcpy(dest, "World"); // 将 "World" 拷贝到 dest
3.3 strcat()
strcat()
用于将两个字符串连接起来。
#include <string.h>char str1[20] = "Hello";
char str2[] = " World!";
strcat(str1, str2); // str1 变为 "Hello World!"
3.4 strcmp()
strcmp()
用于比较两个字符串,返回值分别为:
- 0:字符串相同
- 正数:第一个字符串大于第二个
- 负数:第一个字符串小于第二个
#include <string.h>int result = strcmp("apple", "banana"); // 返回负值
3.5 strchr()
strchr()
用于查找字符在字符串中首次出现的位置。
#include <string.h>char *p = strchr("Hello", 'e'); // p 指向 'e'
4. 字符串与字符数组的区别
虽然字符串是以字符数组的形式存在的,但它与普通的字符数组还是有一些不同之处:
- 空字符
\0
:字符串必须以空字符\0
结尾,这意味着字符串在内存中会占用额外的一个字节。 - 字符数组:普通的字符数组没有
\0
限制,可以包含任意字符或数据。
char str[] = "hello"; // 字符数组包含 5 个字符 + 1 个 '\0'
char arr[] = { 'h', 'e', 'l', 'l', 'o' }; // 不包含 '\0'
5. 动态分配字符串
C 语言中可以使用 malloc()
或 calloc()
来动态分配内存以存储字符串。
#include <stdlib.h>
#include <string.h>char *str = (char *)malloc(20 * sizeof(char)); // 动态分配 20 个字符大小的内存
strcpy(str, "Hello, dynamic memory!");
在使用 malloc()
分配内存时,需要手动释放内存:
free(str); // 释放动态分配的内存
6. 字符串常见错误
6.1 字符串溢出
在 C 中,字符串的长度通常需要自己管理。若字符数组大小不足,可能导致字符串溢出。
char str[5];
strcpy(str, "Hello"); // 溢出,会导致未定义行为
6.2 忘记结尾的 \0
字符串必须以 \0
结尾,若忘记加 \0
,会导致字符串操作函数出错。
char str[] = "Hello"; // 正确
char str[] = {'H', 'e', 'l', 'l', 'o'}; // 错误,缺少 '\0'