我们知道,C标准函数strncpy()不能向目标字符串追加结束符'/0',这经常会引发莫名其妙的问题,详情请查看:C语言strncpy()函数
这里我们定义一个自己的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
当然,这个函数很粗糙,没有考虑各种边界情况,但是提供了一个基本思路,实践过程中可以细化。