临朐网站建设哪家好拼多多seo是什么意思
1 strlen() 函数
1.1 函数原型
#include <string.h> // 必须包含此头文件才能使用 strlen() 函数size_t strlen(const char *str);
1.2 功能说明
strlen() 函数用于计算一个以空字符 \0 结尾的字符串中有效字符的数量(不包括结尾的空字符 '\0')。
- 参数:
- str:指向以空字符 '\0' 结尾的字符串的指针。
- 返回值:
- 返回字符串中有效字符的个数(不包括结尾的 \0)。
- 返回类型为 size_t,是无符号整型,在不同平台上通常是 unsigned int 或 unsigned long。
- 工作原理:
- strlen() 从字符串开头逐字节向后查找;
- 一直找到结束符 \0 为止;
- 统计中间经过的字符数(不包括 \0)。
1.3 注意事项
- 必须是以 '\0' 结尾的字符串:strlen() 会从起始位置一直查找直到遇到 \0。如果字符串未正确终止,可能导致函数访问非法内存,造成程序崩溃或行为异常。
- 不计算结束符 '\0':返回值仅统计有效字符的数量,不包含结尾的空字符 \0。
- 时间复杂度 O(n):函数需要逐个字节遍历字符串,性能随字符串长度线性下降,不适合在高频循环中频繁调用。
- 禁止传入空指针 NULL:如果传入 NULL,行为是未定义的,可能导致程序崩溃。
- 不识别多字节编码(如 UTF-8):strlen() 返回的是字符串所占的字节数,不是实际字符数。
- 例如:printf("%zu\n", strlen("你好")); 将输出 6(每个汉字占 3 字节)。
1.4 应用场景
- 用户输入验证:检查用户名、密码等输入是否符合长度限制,过滤非法数据。
- 动态内存分配:根据字符串长度分配合适的内存空间,避免内存浪费或溢出。
- 数据格式化校验:验证字符串是否符合协议要求(如 HTTP 头部字段、JSON 数据),防止解析错误。
- 提升字符串操作效率:在执行多次字符串操作前,先调用 strlen() 记录长度,避免重复遍历。
- 增强安全性:限制用户输入长度,防止缓冲区溢出攻击(如网络通信、表单提交等场景)。
1.5 示例程序
#include <stdio.h>
#include <string.h> // 必须包含此头文件才能使用 strlen() 函数int main()
{char str[100] = "Hello, World!"; // 字符数组// strlen(): 计算字符串的实际长度(不包括 '\0')printf("strlen(str): %zu\n", strlen(str)); // 输出: 13// sizeof: 计算变量或类型的内存占用大小(包括 '\0' 和数组总大小)printf("sizeof(str): %zu\n", sizeof(str)); // 输出: 100(数组大小,包含 '\0')// 中文字符在 UTF-8 编码下一般占用 3 个字节printf("strlen(\"你好\"): %zu\n", strlen("你好")); // 输出: 6return 0;
}
程序在 VS Code 中的运行结果如下所示:
2 strcpy() 函数
2.1 函数原型
#include <string.h> // 必须包含此头文件才能使用 strcpy() 函数char *strcpy(char *dest, const char *src);
2.2 功能说明
strcpy() 函数用于将一个以空字符 \0 结尾的字符串(源字符串)完整复制到另一个字符数组(目标字符串)中。
- 参数:
- dest:指向目标字符数组的指针,用于存储复制后的字符串。
- src:指向以 \0 结尾的源字符串的指针。
- 返回值:
- 返回指向目标字符串 dest 的指针,即函数返回值为 dest,便于链式调用。
- 工作原理:
- 从源字符串 src 的第一个字符开始,逐个字节复制到目标地址 dest;
- 包括字符串结尾的空字符 \0 也会被复制;
- 复制过程持续到遇到 \0 为止;
- 不检查目标空间是否足够,仅按字节进行复制。
2.3 注意事项
- 目标空间必须足够大:dest 所指向的内存区域必须能够容纳整个 src 字符串(包括结尾的 \0),否则会导致缓冲区溢出。
- 不会自动判断重叠内存:如果 src 和 dest 指向的内存区域有重叠,行为是未定义的。应避免此类情况或使用 memmove() 替代。
- 不处理多字节字符编码:strcpy() 只是机械地复制每个字节,不识别 UTF-8、GBK 等多字节字符结构,可能导致字符损坏或乱码。
- 传入 NULL 是未定义行为:如果 src 或 dest 为 NULL,程序行为未定义,可能导致崩溃。
- 性能较好但不安全:虽然效率高,但由于不进行边界检查,容易引发安全问题,建议在可控环境下使用或优先考虑更安全的替代函数(如 strncpy())。
2.4 应用场景
- 简单字符串赋值:适用于已知目标空间足够大的情况,直接将一个字符串内容复制给另一个。
- 数据初始化:用于初始化字符数组内容,例如配置信息、日志路径等。
- 临时缓存操作:在局部作用域中对字符串进行复制和修改,不影响原始字符串。
- 系统底层开发:在嵌入式、驱动等资源受限环境中,由于效率高而常被使用。
2.5 示例程序
#include <stdio.h>
#include <string.h> // 必须包含此头文件才能使用 strcpy() 函数int main()
{char src[50] = "Hello, World!";char dest[50]; // 确保目标缓冲区足够大// strcpy(): 将 src 字符串复制到 deststrcpy(dest, src);printf("源字符串: %s\n", src);printf("目标字符串: %s\n", dest);printf("复制的字符串长度: %zu\n", strlen(dest));// 演示缓冲区不足的风险(危险示例,不要在实际代码中这样使用)char small_dest[5];// strcpy(small_dest, src); // 这会导致缓冲区溢出!// 内存初始化:配合其他函数使用,初始化内存区域。char uninit_buffer[50]; // 未初始化的缓冲区printf("未初始化的缓冲区内容(可能包含垃圾值): %s\n", uninit_buffer);// 使用 strcpy() 初始化缓冲区strcpy(uninit_buffer, "Initial String");printf("初始化后的缓冲区内容: %s\n", uninit_buffer);return 0;
}
程序在 VS Code 中的运行结果如下所示:
3 strncpy() 函数
3.1 函数原型
#include <string.h> // 必须包含此头文件才能使用 strncpy() 函数char *strncpy(char *dest, const char *src, size_t n);
3.2 功能说明
strncpy() 函数用于将一个以空字符 \0 结尾的字符串(源字符串)复制到另一个字符数组(目标字符串)中,最多复制 n 个字节。
- 参数:
- dest:指向目标字符数组的指针,用于存储复制后的字符串。
- src:指向以 \0 结尾的源字符串的指针。
- n:要复制的最大字符数(字节数)。
- 返回值:
- 返回指向目标字符串 dest 的指针,便于链式调用。
-
工作原理:
- 从源字符串 src 中逐个字节复制数据到目标地址 dest;
- 最多复制 n 个字节;
- 如果在复制过程中遇到 \0,则继续复制 \0 直到复制满 n 个字节;
- 如果未复制满 n 个字节且没有遇到 \0,则不会自动添加结束符 \0;
- 不检查目标缓冲区是否足够大,需用户自行保证。
3.3 注意事项
- 目标空间必须足够大:虽然限制了复制的字节数,但用户仍需确保 dest 能容纳至少 n 个字节的数据。
- 不一定会自动添加 '\0':如果 src 长度大于等于 n,复制完成后 dest 中可能没有结尾的 \0,需要手动添加,否则后续字符串操作可能导致错误。
- 可能会填充多余 '\0':如果 src 长度小于 n,strncpy() 会用 \0 填充剩余空间,这可能造成性能浪费。
- 不处理多字节字符编码:与 strcpy() 一样,strncpy() 按字节复制,不识别 UTF-8、GBK 等多字节字符结构,容易导致字符截断或乱码。
- 内存重叠行为未定义:如果 src 和 dest 所指内存区域有重叠,结果不可预测。应避免此类情况或使用 memmove() 替代。
- 比 strcpy 更安全但仍需谨慎使用:虽然可以通过限制复制长度防止溢出,但不当使用仍可能导致缓冲区问题或非法字符串。
3.4 应用场景
- 固定长度字符串复制:适用于目标缓冲区大小已知的情况,如配置读取、日志写入等。
- 字符串截断操作:用于提取字符串前若干个字符,例如只保留用户名的前 10 位。
- 嵌入式系统开发:在资源受限环境中用于控制内存拷贝边界。
- 构造安全字符串接口:作为更安全字符串函数的基础,在封装后用于防御缓冲区溢出攻击。
3.5 示例程序
#include <stdio.h>
#include <string.h> // 必须包含此头文件才能使用 strncpy() 函数int main()
{char src[50] = "Hello, World!";char dest[50]; // 确保目标缓冲区足够大// strncpy(): 将 src 字符串的前 5 个字符复制到 deststrncpy(dest, src, 5);dest[5] = '\0'; // 手动添加空字符,因为前 5 个字符不包含结尾的 \0printf("源字符串: %s\n", src);printf("目标字符串: %s\n", dest);printf("复制的字符串长度: %zu\n", strlen(dest));// 演示 strncpy() 的安全特性char small_dest[10];// 安全地复制,不会溢出,限制了复制的字符数// sizeof(small_dest) - 1 是为了留出空间给空字符strncpy(small_dest, src, sizeof(small_dest) - 1);small_dest[sizeof(small_dest) - 1] = '\0'; // 确保以空字符结尾printf("安全复制到小缓冲区: %s\n", small_dest);// 演示自动填充空字符char dest_fill[10];// 如果 src 的长度小于 n,dest 会用额外的空字符('\0')填充直到复制了 n 个字符strncpy(dest_fill, "Hi", sizeof(dest_fill));printf("自动填充示例: '%s' (长度: %zu)\n", dest_fill, strlen(dest_fill));return 0;
}
程序在 VS Code 中的运行结果如下所示:
4 strcat() 函数
4.1 函数原型
#include <string.h> // 必须包含此头文件才能使用 strcat() 函数char *strcat(char *dest, const char *src);
4.2 功能说明
strcat() 函数用于将一个以空字符 \0 结尾的字符串(源字符串)追加到另一个字符串的末尾,并自动保持结果为一个以 \0 结尾的有效字符串。
- 参数:
- dest:指向目标字符串的指针,该字符串必须是可修改的,并且有足够的空间容纳自身内容 + 要追加的内容 + 一个 \0。
- src:指向以 \0 结尾的源字符串的指针。
- 返回值:
- 返回指向目标字符串 dest 的指针,便于链式调用。
-
工作原理:
-
从 dest 字符串的结束符 \0 开始向后写入;
-
将 src 中的所有字符(包括结尾的 \0)逐个复制到 dest 的末尾;
-
最终生成的新字符串仍以 \0 结尾;
-
不检查目标缓冲区是否足够大,容易造成缓冲区溢出。
-
4.3 注意事项
-
目标空间必须足够大:dest 所指向的内存必须能够容纳 dest 原有字符串 + src 字符串 + 一个 \0,否则会导致缓冲区溢出,引发未定义行为。
-
不会自动判断内存重叠:如果 src 和 dest 指向的内存区域有重叠,行为是未定义的,应避免此类操作或使用更安全的方式处理。
-
不处理多字节字符编码:strcat() 只是按字节拼接字符串,不识别 UTF-8、GBK 等多字节字符结构,可能导致字符损坏或乱码。
-
传入 NULL 是未定义行为:如果 src 或 dest 为 NULL,程序行为不可预测,可能导致崩溃。
-
性能较好但不安全:虽然效率高,但由于没有边界检查机制,使用时需格外小心,建议在可控环境下使用或优先考虑更安全的替代函数(如 strncat())。
4.4 应用场景
- 字符串拼接操作:适用于将多个字符串组合成一个完整字符串,例如路径拼接、日志信息组装等。
- 数据动态构建:在运行时逐步构建输出字符串,如 HTML、JSON 数据构造。
- 格式化输出辅助:与 sprintf() 等函数配合使用,实现灵活的字符串拼接逻辑。
- 系统底层开发:在嵌入式或性能敏感场景中,用于快速拼接固定内容字符串。
4.5 示例程序
#include <stdio.h>
#include <string.h> // 必须包含此头文件才能使用 strcat() 函数int main()
{char base[50] = "Hello, ";char add[50] = "World!";char result[50];// 首先使用 strcpy 初始化目标字符串strcpy(result, base); // 复制 base 到 result// strcat(): 将 add 字符串追加到 result 末尾strcat(result, add);printf("基础字符串: %s\n", base);printf("追加字符串: %s\n", add);printf("连接后的字符串: %s\n", result);printf("连接后的字符串长度: %zu\n", strlen(result)); // 13// 演示多次追加char multi_cat[50] = "Start";strcat(multi_cat, " ");strcat(multi_cat, "with ");strcat(multi_cat, "strcat!");printf("多次追加结果: %s\n", multi_cat);// 演示缓冲区不足的风险(危险示例,不要在实际代码中这样使用)char small_dest[6] = "Hello";// strcat(small_dest, ", World!"); // 这会导致缓冲区溢出!return 0;
}
程序在 VS Code 中的运行结果如下所示:
5 strncat() 函数
5.1 函数原型
#include <string.h> // 必须包含此头文件才能使用 strncat() 函数char *strncat(char *dest, const char *src, size_t n);
5.2 功能说明
strncat() 函数用于将一个以空字符 \0 结尾的字符串(源字符串)最多前 n 个字节的内容追加到另一个字符串的末尾,并自动在拼接完成后添加字符串结束符 \0。
- 参数:
- dest:指向目标字符串的指针,该字符串必须是可修改的,并且有足够的空间容纳自身内容 + 要追加的内容 + 一个 \0。
- src:指向以 \0 结尾的源字符串的指针。
- n:要从 src 中复制的最大字符数(字节数)。
- 返回值:
- 返回指向目标字符串 dest 的指针,便于链式调用。
-
工作原理:
-
找到 dest 字符串的结尾(即第一个 \0);
-
从 src 的开头开始复制最多 n 个字节;
-
复制结束后,在末尾添加新的 \0;
-
不检查目标缓冲区是否足够大,需用户自行保证。
-
5.3 注意事项
-
目标空间必须足够大:dest 所指向的内存必须能够容纳 dest 原有字符串 + src 的前 n 个字符 + 一个 \0,否则会导致缓冲区溢出。
-
始终会添加 '\0':即使复制了 n 个字符,strncat() 也会在最后自动添加字符串结束符 \0,所以目标缓冲区至少需要多 1 字节的空间。
-
不处理多字节字符编码:与 strcat() 类似,strncat() 按字节操作,不识别 UTF-8、GBK 等多字节字符结构,容易导致字符截断或乱码。
-
不会判断内存重叠:如果 src 和 dest 所指内存区域有重叠,行为未定义,应避免此类情况或使用更安全的方式处理。
-
比 strcat 更安全但仍需谨慎使用:虽然可以通过限制复制长度防止溢出,但不当使用仍可能导致缓冲区问题或非法字符串。
5.4 应用场景
- 有限制的字符串拼接:适用于目标缓冲区大小已知的情况,如日志记录、路径拼接等。
- 构建动态字符串内容:用于逐步拼接配置信息、输出语句等,控制每次拼接的数据量。
- 嵌入式系统开发:在资源受限环境中,用于安全地拼接固定长度字符串。
- 封装安全接口:作为构建更安全字符串函数的基础,用于防御缓冲区溢出攻击。
5.5 示例程序
#include <stdio.h>
#include <string.h> // 必须包含此头文件才能使用 strncat() 函数int main()
{char base[50] = "Hello, ";char add[50] = "World!";char result[50];// 首先使用 strcpy 初始化目标字符串strcpy(result, base); // 复制 base 到 result// strncat(): 将 add 字符串的前 5 个字符(World)追加到 result 末尾strncat(result, add, 5);printf("基础字符串: %s\n", base);printf("追加字符串: %s\n", add);printf("部分连接后的字符串: %s\n", result); // Hello, Worldprintf("连接后的字符串长度: %zu\n", strlen(result)); // 12// 演示 strncat() 的安全特性char small_dest[10] = "Hello";// 安全地追加,不会溢出, 限制了追加的字符数(最多只能添加 4 个)strncat(small_dest, ", World! Thanks", sizeof(small_dest) - strlen(small_dest) - 1);printf("安全追加到小缓冲区: %s\n", small_dest);// 演示精确控制追加长度char precise_cat[50] = "Start";strncat(precise_cat, " with strncat! look my length", 13); // 只追加前 13 个字符printf("精确控制追加长度: %s\n", precise_cat);return 0;
}
程序在 VS Code 中的运行结果如下所示:
6 strcmp() 函数
6.1 函数原型
#include <string.h> // 必须包含此头文件才能使用 strcmp() 函数int strcmp(const char *str1, const char *str2);
6.2 功能说明
strcmp() 函数用于比较两个以空字符 \0 结尾的字符串的内容。它会逐字节比较两个字符串中的字符,直到遇到不匹配的字符或其中一个字符串结束。
- 参数:
- str1:指向第一个要比较的字符串的指针。
- str2:指向第二个要比较的字符串的指针。
- 返回值:
- 如果 str1 和 str2 相同,则返回 0。
- 如果 str1 所指向的字符串小于 str2,则返回一个负整数(通常是 -1)。
- 如果 str1 所指向的字符串大于 str2,则返回一个正整数(通常是 1)。
-
工作原理:
- 从两个字符串的第一个字符开始逐个字节进行比较;
- 比较依据的是字符的 ASCII 值(即按照 unsigned char 类型进行比较);
- 一旦发现不同字符,则立即停止;
- 如果所有字符都相同,直到遇到 \0,则返回 0,表示两个字符串相等。
6.3 注意事项
- 区分大小写:strcmp() 是区分大小写的,例如 'A' 和 'a' 被视为不同的字符。
- 不处理多字节字符编码:函数按字节比较字符串内容,不识别 UTF-8、GBK 等多字节字符结构,可能导致非预期的排序结果。
- 传入 NULL 是未定义行为:如果 str1 或 str2 为 NULL,程序行为不可预测,可能导致崩溃。
- 适用于 ASCII 字符串比较:对于英文和标准符号比较准确,但在处理中文、特殊语言字符时需谨慎。
- 性能较好:由于直接操作内存字节,效率高,适合在已知字符串编码的情况下使用。
6.4 应用场景
- 字符串排序与查找:用于对字符串数组进行排序、查找匹配项等操作。
- 用户权限/命令判断:在命令解析、配置读取中用于判断字符串是否匹配。
- 数据校验:用于验证输入是否符合预期字符串(如密码、关键字等)。
- 日志与调试输出控制:通过字符串比较控制不同级别的日志输出开关。
- 协议解析:在网络通信、文件格式解析中用于判断字段名、标签等。
6.5 示例程序
#include <stdio.h>
#include <string.h> // 必须包含此头文件才能使用 strcmp() 函数int main()
{char str1[50] = "apple";char str2[50] = "banana";char str3[50] = "apple";char str4[50] = "Apple"; // 注意大小写不同// strcmp() 基本比较int result1 = strcmp(str1, str2);// 因为第一个字符 'a' < 'b',所以 str1 < str2printf("比较 '%s' 和 '%s': %d\n", str1, str2, result1); // 负数int result2 = strcmp(str2, str1);// 因为第一个字符 'b' > 'a',所以 str2 > str1printf("比较 '%s' 和 '%s': %d\n", str2, str1, result2); // 正数int result3 = strcmp(str1, str3);// 两者所有字符都相同,所以 str1 == str3printf("比较 '%s' 和 '%s': %d\n", str1, str3, result3); // 0int result4 = strcmp(str1, str4);// 因为第一个字符 'a'(ASCII 97) > 'A'(ASCII 65),所以 str1 > str4printf("比较 '%s' 和 '%s': %d\n", str1, str4, result4); // 正数// 实际应用示例:排序检查// 定义一个二维数组,每个元素是一个字符串char fruits[4][10] = {"orange", "apple", "banana", "grape"};// 获取数组的行数int n = sizeof(fruits) / sizeof(fruits[0]);// 简单的冒泡排序示例for (int i = 0; i < n - 1; i++) // 外层循环控制排序的轮数{for (int j = 0; j < n - i - 1; j++) // 内层循环控制每轮的比较次数{if (strcmp(fruits[j], fruits[j + 1]) > 0) // 比较相邻的两个字符串{char temp[10]; // 用于交换的临时字符串strcpy(temp, fruits[j]); // 复制第一个字符串到临时字符串strcpy(fruits[j], fruits[j + 1]); // 将第二个字符串复制到第一个位置strcpy(fruits[j + 1], temp); // 将临时字符串复制到第二个位置}}}printf("\n排序后的水果列表:\n");for (int i = 0; i < n; i++){printf("%d: %s\n", i, fruits[i]);}return 0;
}
程序在 VS Code 中的运行结果如下所示:
7 strcnmp() 函数
7.1 函数原型
#include <string.h> // 必须包含此头文件才能使用 strncmp() 函数int strncmp(const char *str1, const char *str2, size_t n);
7.2 功能说明
strncmp() 函数用于比较两个以空字符 \0 结尾的字符串的前 n 个字符。它会逐字节比较两个字符串,最多比较 n 个字符,或者在遇到字符串结束符 \0 时提前停止。
- 参数:
- str1:指向第一个要比较的字符串的指针。
- str2:指向第二个要比较的字符串的指针。
- n:要比较的最大字符数(字节数)。
- 返回值:
- 如果前 n 个字符相同,或两个字符串在 \0 前完全一致,则返回 0。
- 如果 str1 所指向的字符串小于 str2,则返回一个负整数值(通常是 -1)。
- 如果 str1 所指向的字符串大于 str2,则返回一个正整数值(通常是 1)。
-
工作原理:
-
从两个字符串的第一个字符开始逐个字节进行比较;
-
比较依据的是字符的 ASCII 值(即按 unsigned char 类型进行比较);
-
最多比较 n 个字符;
-
一旦发现不同字符,立即停止;
-
如果所有比较的字符都相同,则返回 0;
-
即使其中一个字符串在 n 字节内没有遇到 \0,也会继续比较完 n 个字节。
-
7.3 注意事项
- 区分大小写:与 strcmp() 一样,strncmp() 是区分大小写的。
- 不处理多字节字符编码:函数按字节操作,不识别 UTF-8、GBK 等多字节字符结构,可能导致非预期的排序结果。
- 传入 NULL 是未定义行为:如果 str1 或 str2 为 NULL,程序行为不可预测,可能导致崩溃。
- 适合比较固定长度字段:适用于只关心前若干字符的情况,如协议字段、命令匹配等。
- 性能较好:由于限制了比较长度,效率通常优于 strcmp(),适合高频比较场景。
7.4 应用场景
- 命令解析与匹配:例如判断用户输入是否以 "exit" 开头,可使用 strncmp(cmd, "exit", 4)。
- 协议字段校验:在网络通信或文件格式解析中,用于快速判断头部字段是否匹配。
- 字符串前缀检查:判断某个字符串是否具有特定前缀,例如 URL 是否以 "http://" 开头。
- 日志级别控制:通过比较前缀字符串来决定是否输出对应级别的日志信息。
- 数据库索引优化:用于部分字符串的快速比较,提升查找效率。
7.5 示例程序
#include <stdio.h>
#include <string.h> // 必须包含此头文件才能使用 strncmp() 函数int main()
{char str1[50] = "application";char str2[50] = "apple";char str3[50] = "apricot";char str4[50] = "APPLE"; // 注意大小写不同// strncmp() 基本比较int result1 = strncmp(str1, str2, 4);// 因为前 4 个字符相同,所以返回 0printf("比较 '%s' 和 '%s' 的前4个字符: %d\n", str1, str2, result1); // 0int result2 = strncmp(str1, str2, 5);// 因为第 5 个字符不同,'i'(ASCII 105) > 'e'(ASCII 101),所以返回正数printf("比较 '%s' 和 '%s' 的前5个字符: %d\n", str1, str2, result2); // 正数int result3 = strncmp(str1, str3, 3);// 因为第 3 个字符不同,'p'(ASCII 112) < 'r'(ASCII 114),所以返回负数printf("比较 '%s' 和 '%s' 的前3个字符: %d\n", str1, str3, result3); // 负数int result4 = strncmp(str2, str4, 5);// 因为第一个字符不同,'a'(ASCII 97) > 'A'(ASCII 65),所以返回正数printf("比较 '%s' 和 '%s' 的前5个字符: %d\n", str2, str4, result4); // 正数// 实际应用示例:检查 URL 前缀const char url[] = "https://example.com";const char http_prefix[] = "http://";const char https_prefix[] = "https://";if (strncmp(url, http_prefix, 7) == 0){printf("这是一个HTTP URL\n");}else if (strncmp(url, https_prefix, 8) == 0){printf("这是一个HTTPS URL\n");}else{printf("未知协议\n");}return 0;
}
程序在 VS Code 中的运行结果如下所示:
8 字符串基础操作函数总结
函数名 | 功能 | 参数 | 返回值 | 安全性 |
---|---|---|---|---|
strlen | 计算字符串长度(不包括终止符 '\0') | const char *str(指向要计算长度的字符串的指针) | 返回字符串长度(size_t) | 安全(不修改字符串) |
strcpy | 复制字符串(包括终止符 '\0') | char *dest(指向目标字符串的指针), const char *src(指向源字符串的指针) | 返回目标字符串指针(char*) | 不安全(可能导致缓冲区溢出,因为不检查目标缓冲区大小) |
strncpy | 复制字符串,最多复制 n 个字符(包括终止符 '\0',如果源字符串足够长) | char *dest(指向目标字符串的指针), const char *src(指向源字符串的指针), size_t n(要复制的最大字符数) | 返回目标字符串指针(char*) | 较安全(需确保 n 足够大以容纳终止符,但可能不添加终止符如果源字符串短于 n) |
strcat | 连接字符串(将 src 追加到 dest 末尾,包括终止符 '\0') | char *dest(指向目标字符串的指针,该字符串应有足够的空间容纳追加后的结果), const char *src(指向要追加的源字符串的指针) | 返回目标字符串指针(char*) | 不安全(可能导致缓冲区溢出,因为不检查目标缓冲区剩余空间) |
strncat | 连接字符串,最多追加 n 个字符(包括终止符 '\0') | char *dest(指向目标字符串的指针,该字符串应有足够的空间容纳追加后的结果), const char *src(指向要追加的源字符串的指针), size_t n(要追加的最大字符数) | 返回目标字符串指针(char*) | 较安全(需确保 n 足够大以容纳终止符,但会确保追加后字符串以 '\0' 结尾) |
strcmp | 比较两个字符串(按字典序) | const char *str1(指向第一个要比较的字符串的指针), const char *str2(指向第二个要比较的字符串的指针) | 返回 int(负值、0 或正值,表示 str1 小于、等于或大于 str2) | 安全(不修改字符串) |
strncmp | 比较两个字符串的前 n 个字符(按字典序) | const char *str1(指向第一个要比较的字符串的指针), const char *str2(指向第二个要比较的字符串的指针), size_t n(要比较的最大字符数) | 返回 int(负值、0 或正值,表示 str1 小于、等于或大于 str2) | 安全(不修改字符串) |
其他类似但非标准 C 库的函数:
- strdup:类似于 strcpy 结合动态内存分配,用于复制字符串并返回新分配的字符串指针(包括终止符 '\0'),但通常不是标准 C 库的一部分,使用后需手动释放内存。
- stpcpy:类似于 strcpy,用于复制字符串(包括终止符 '\0'),但返回的是目标字符串末尾的指针,而非目标字符串起始指针,且通常不是标准 C 库的一部分。
- strcmpi / stricmp:类似于 strcmp,用于不区分大小写地比较两个字符串(按字典序),但通常不是标准 C 库的一部分。
- strncmpi / strnicmp:类似于 strncmp,用于不区分大小写地比较两个字符串的前 n 个字符(按字典序),但通常不是标准 C 库的一部分。