C语言库函数模拟实现:strcpy、strcat与strcmp详解
C语言字符串处理是面试与开发的常见考点。本文通过手动模拟实现 strcpy、strcat 和 strcmp 三个标准库函数,深入解析指针遍历、字符赋值及ASCII值比较的核心逻辑,揭示内存安全与数据返回的关键细节。
实现strcpy:字符串拷贝的指针移动
strcpy 的核心任务是将源字符串的内容完整复制到目标缓冲区,并包含末尾的结束符 '\0'。实现时需利用两个指针进行同步遍历,确保目标地址的完整性。
第1步:参数校验与安全初始化
在进行任何指针解引用前,必须使用 assert 宏检查输入指针是否为空,防止段错误。同时记录目标数组的起始地址,以便后续返回正确的指针值。
char* my_strcpy(char* dest, char* str)
{
// 确保目标与源指针有效,非空则继续执行
assert(dest && str);
// 保留首地址用于最后返回
char* tmp = dest;
}第2步:循环拷贝与终止符处理
通过 while 循环逐个读取源字符串字符并赋值给目标位置。循环结束后,务必手动为当前目标位置写入 '\0',以标志字符串结束。这是模拟实现中最易遗漏的步骤。
while (*str != '\0')
{
*dest = *str; // 单个字符拷贝
dest++; // 指针后移
str++;
}
*dest = '\0'; // 显式添加字符串结束符
return tmp; // 返回指向新字符串开头的指针
}完整的测试用例如下:
int main()
{
// 预分配足够空间,原内容会被覆盖
char arr1[20] = "xxxxxxxxxxxxxxx";
const char arr2[] = "study hard!";
my_strcpy(arr1, arr2);
printf("%s\n", arr1);
return 0;
}
实现strcat:字符串连接的定位技巧
strcat 的功能是将源字符串追加到目标字符串的末尾。与拷贝不同,它首先需要精确定位目标字符串的尾部,随后在该位置开始进行字符复制。
第1步:定位目标尾端
使用一个指针扫描目标字符串,直到遇到 '\0' 为止。此时指针指向的就是追加操作的起始位置。这一步是连接成功的前提。
char* my_strcat(char* dest, const char* str)
{
assert(dest && str);
char* tmp = dest;
// 寻找目标字符串的结尾(即第一个 \0)
while (*dest != '\0')
{
dest++;
}
}第2步:连续拼接与自动结束
从目标尾部开始,将源字符串内容逐个拷贝过去。利用 *dest++ = *str++ 这种简写形式可以在赋值的同时推进指针。当源字符串被全部拷贝且包含其自身的 '\0' 后,拼接自然完成。
// 链接字符串,直到遇到源串的结束符
while (*dest++ = *str++)
{
;
}
*dest = '\0'; // 最终明确标记字符串结尾
return tmp;
}相关调用示例:
int main()
{
char arr1[20] = "hello";
const char arr2[] = " world!";
my_strcat(arr1, arr2);
printf("%s\n", arr1); // 预期输出: hello world!
return 0;
}
实现strcmp:基于ASCII的比较逻辑
strcmp 并非比较字符串长度,而是按照字典序逐位比较对应字符的 ASCII 码值。返回值取决于第一次出现差异的位置或两串相等的情况。
第1步:逐位同频比对
只要两个字符串当前位的字符相等,就同时向后移动指针。若在某一位发现不相等,或者两者都到达了 '\0',则跳出循环。
int my_strcmp(const char* str1, const char* str2)
{
assert(str1 && str2);
while (*str1 == *str2)
{
if (*str1 == '\0') return 0; // 完全相等时提前返回0
str1++;
str2++;
}
}第2步:计算差值判定大小
退出循环时,要么是因为字符不相等(此时需要判断谁大),要么是因为都到了尾部(此时返回0)。直接返回 *str1 - *str2 的差值:结果小于0表示前者小,大于0表示前者大。
return *str1 - *str2; // 直接返回ASCII差值 }
测试验证:
int main()
{
const char arr1[] = "abcdef";
const char arr2[] = "abcder";
int ret = my_strcmp(arr1, arr2);
if (ret < 0) printf("<\n");
else if (ret == 0) printf("=\n");
else printf(">\n");
return 0;
}
总结:
通过对这三个经典函数的模拟重写,可以清晰看到指针在解决“查找-移动-赋值”这一系列动作中的灵活应用。准确识别字符串结束符位置,并处理指针的空指针越界风险,是实现稳健C代码的基础。
以上就是C语言中strcpy、strcat、strcmp三个函数的模拟实现的详细内容,更多关于C语言字符串处理的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













