自定义一个函数,实现strncpy()函数的功能,并消除它的缺陷
我们知道,C标准函数strncpy()不能向目标字符串追加结束符'\0',这经常会引发莫名其妙的问题,详情请查看:C语言strncpy()函数
这里我们定义一个自己的strncpy()来复制字符串的前n个字符,并且向目标字符串追加结束符'\0'。请看代码:
举个完整的例子:
dest=abc
当然,这个函数很粗糙,没有考虑各种边界情况,但是提供了一个基本思路,实践过程中可以细化。
这里我们定义一个自己的strncpy()来复制字符串的前n个字符,并且向目标字符串追加结束符'\0'。请看代码:
// 因为涉及到内存操作,需要 #include <stdlib.h> char *myStrncpy(char *dest, const char *src, size_t n){ int size = sizeof(char)*(n+1); char *tmp = (char*)malloc(size); // 开辟大小为n+1的临时内存tmp if(tmp){ memset(tmp, '\0', size); // 将内存初始化为0 memcpy(tmp, src, size-1); // 将src的前n个字节拷贝到tmp memcpy(dest, tmp, size); // 将临时空间tmp的内容拷贝到dest free(tmp); // 释放内存 return dest; }else{ return NULL; } }
举个完整的例子:
#include<stdio.h> #include<string.h> #include <stdlib.h> char *myStrncpy(char *dest, const char *src, size_t n); int main(void){ char dest[20]; char src[] = "abcxyz"; printf("dest=%s\n", myStrncpy(dest,src,3)); return 0; } char *myStrncpy(char *dest, const char *src, size_t n){ int size = sizeof(char)*(n+1); char *tmp = (char*)malloc(size); // 开辟大小为n+1的临时内存tmp if(tmp){ memset(tmp, '\0', size); // 将内存初始化为0 memcpy(tmp, src, size-1); // 将src的前n个字节拷贝到tmp memcpy(dest, tmp, size); // 将临时空间tmp的内容拷贝到dest free(tmp); // 释放内存 return dest; }else{ return NULL; } }运行结果:
dest=abc
当然,这个函数很粗糙,没有考虑各种边界情况,但是提供了一个基本思路,实践过程中可以细化。