您当前的位置:首页 > 计算机 > 编程开发 > C语言

自定义一个函数,实现strncpy()函数的功能,并消除它的缺陷

时间:12-31来源:作者:点击数:

我们知道,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

当然,这个函数很粗糙,没有考虑各种边界情况,但是提供了一个基本思路,实践过程中可以细化。

方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门