0
点赞
收藏
分享

微信扫一扫

【c语言进阶】strncpy介绍(包含特性)及其模拟实现

受长度限制的string函数

int main(void)
{
    char arr1[] = "abcdef";
    char arr2[] = "qwertyuiop";
    strncpy(arr1, arr2,6);
    printf("%s\n",arr1);
    return 0;
}

即拷贝六个字符

int main(void)
{
    char arr1[100] = { 'a', 'b', 'c', 'd', 'e', 'f', '\0', '\0', 'E', '\0', '\0', 'F' };
    char arr2[] = "qwerty";
    strncpy(arr1, arr2, 20);
    printf("%s\n", arr1);
    return 0;
}

请添加图片描述
请添加图片描述

由此可以得出结论
如果源字符串的长度小于num,则拷贝完源字符串之后,在目标的后边追加0,直到num个


模拟实现

#模拟实现

char* my_strncpy(char* dest ,char* src,int sz)
{
    assert(dest && src);
    char* ret = dest;
    int len = strlen(src);
    if (len >= sz)//如果sz小于源字符串的长度,则简简单单遍历赋值即可
    {
        for (int i = 0; i < sz; i++)
        {
            *dest++ = *src++;
        }
        *dest = '\0';
    }
    else//如果sz大于源字符串的长度,那么就凑\0,直到满足sz长度为止.
    {
        for (int i = 0; i < len; i++)
        {
            *dest++ = *src++;
        }
        for (int i = 0; i < sz - len; i++)
        {
            *dest++ = '\0';
        }
    }
    return ret;
    
}

int main(void)
{
    char arr1[100] = { 'a', 'b', 'c', 'd', 'e', 'f', '\0', 'E', 'E', 'F', 'E', 'E' };
    char arr2[] = "qwerty";
    my_strncpy(arr1, arr2, 10);
    printf("%s\n", arr1);
    return 0;
}

如果我们的代码正确,那么此时的'F'将会也变成'\0',而它后面那个'E'则不会变成'\0'
之前:
请添加图片描述

之后:

请添加图片描述

确实实现了strncpy函数以及其特性的模拟!

举报

相关推荐

0 条评论