string.h 是 C 语言中处理字符串和内存操作的标准头文件。它包含了许多常用的字符串处理函数和内存操作函数。

主要函数分类

字符串复制

1
2
3
4
5
6
char* strcpy(char* dest, const char* src);
// 将 src 复制到 dest(包括 '\0')
// 注意:不会检查 dest 大小,可能溢出

char* strncpy(char* dest, const char* src, size_t n);
// 最多复制 n 个字符,更安全

字符串连接

1
2
3
4
5
char* strcat(char* dest, const char* src);
// 将 src 连接到 dest 末尾

char* strncat(char* dest, const char* src, size_t n);
// 最多连接 n 个字符

字符串比较

1
2
3
4
5
6
int strcmp(const char* s1, const char* s2);
// 比较两个字符串
// 返回 0: 相等,<0: s1<s2,>0: s1>s2

int strncmp(const char* s1, const char* s2, size_t n);
// 比较前 n 个字符

字符串查找

1
2
3
4
5
6
7
8
9
10
11
12
13
14
char* strchr(const char* s, int c);
// 查找字符 c 第一次出现的位置

char* strrchr(const char* s, int c);
// 查找字符 c 最后一次出现的位置

char* strstr(const char* haystack, const char* needle);
// 查找子串 needle 在 haystack 中的位置

size_t strspn(const char* s, const char* accept);
// 计算 s 开头连续包含 accept 字符的个数

size_t strcspn(const char* s, const char* reject);
// 计算 s 开头连续不包含 reject 字符的个数

字符串分割

1
2
3
4
5
6
char* strtok(char* s, const char* delim);
// 用 delim 分割字符串 s
// 注意:会修改原字符串,非线程安全

char* strtok_r(char* s, const char* delim, char** saveptr);
// 线程安全版本(POSIX 标准)

字符串长度

1
2
size_t strlen(const char* s);
// 返回字符串长度(不包括 '\0')

内存操作函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
void* memcpy(void* dest, const void* src, size_t n);
// 复制内存区域(不处理重叠)

void* memmove(void* dest, const void* src, size_t n);
// 复制内存区域(处理重叠)

void* memset(void* s, int c, size_t n);
// 将内存区域设置为指定值

int memcmp(const void* s1, const void* s2, size_t n);
// 比较内存区域

void* memchr(const void* s, int c, size_t n);
// 在内存区域中查找字符

实用示例

示例 1:基础字符串操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <stdio.h>
#include <string.h>
int main()
{
char str1[20] = "Hello";
char str2[20] = "World";
char buffer[50];

// 字符串复制
strcpy(buffer, str1);
printf("复制: %s\n", buffer);

// 字符串连接
strcat(buffer, " ");
strcat(buffer, str2);
printf("连接: %s\n", buffer);

// 字符串比较
int cmp = strcmp(str1, str2);
printf("比较: %d\n", cmp);

// 字符串长度
printf("长度: %lu\n", strlen(buffer));

return 0;
}

示例 2:字符串查找和分割

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <stdio.h>
#include <string.h>

int main()
{
char text[] = "apple,banana,cherry,date";
char *token;

// 使用 strtok 分割字符串
printf("分割结果:\n");
token = strtok(text, ",");
while (token != NULL)
{
printf(" %s\n", token);
token = strtok(NULL, ",");
}
// 查找子串
char str[] = "The quick brown fox jumps over the lazy dog";
char *pos = strstr(str, "brown");
if (pos)
{
printf("找到 'brown',位置: %ld\n", pos - str);
}

return 0;
}

示例 3:内存操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <stdio.h>
#include <string.h>

int main()
{
int arr1[5] = {1, 2, 3, 4, 5};
int arr2[5];

// 内存复制
memcpy(arr2, arr1, sizeof(arr1));
printf("复制数组: ");
for (int i = 0; i < 5; i++)
{
printf("%d ", arr2[i]);
}
printf("\n");

// 内存设置
memset(arr2, 0, sizeof(arr2));
printf("清零后: ");
for (int i = 0; i < 5; i++)
{
printf("%d ", arr2[i]);
}
printf("\n");

return 0;
}