strcpy和strncpy的区别以及模拟实现

strcpy(字符串拷贝)
原型:
这里写图片描述
头文件:#include< string.h >
参数: 第一个参数为:目标字符串。第二个参数为源字符串。
返回类型:char*。
作用: 把源字符串(strSource)拷贝到目标字符串(strDestination)上。
注意事项:1. 目标空间必须足够大且可以被修改;2. 源字符串中必须有‘\0’;3. 源字符串不可以被修改。
参考代码(库函数实现):

#include<stdio.h>
#include<stdlib.h>
int main()
{
    const char p[] = "abcd"; //源字符串中有‘\0’,且不能被改
    char s[20]={0};        //目标空间足够大
    strcpy(s, p);
    printf("%s\n", s);
    system("pause");
    return 0;
}

运行:
这里写图片描述
模拟实现strcpy
代码:

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
char * my_strcpy(char *dest,const char *src)
{
    char *ret = dest;
    assert(src);    //断言,若字符串为空则不执行下面的代码
    assert(dest);   //断言,若字符串为空则不执行下面的代码
    while (*dest++ = *src++)
    {
        ;
    }
    return ret;
}
int main()
{
    const char p[] = "abcdef";   //源字符串中必须有‘\0’
    char s[20]={0};            //目标空间必须足够大
    char*ret=my_strcpy(s, p);
    printf("%s\n", ret);
    system("pause");
    return 0;
}

运行:
这里写图片描述


strncpy(长度受限制的字符串拷贝)
原型:
这里写图片描述
里面的count是指:
这里写图片描述
即复制多少个。
头文件:#include< string.h>
参数:第一个参数为:目标字符串。第二个参数为源字符串。第三个参数为无符号的整形数。
返回类型:char*。
作用:把源字符串(strSource)中的count个字符拷贝到目标字符串(strDest)中。
注意事项:目标空间必须足够大且可以被修改,源字符串不可以被修改,如果源字符串的长度小于count个,则拷贝完有效字符串之后,在目标后面追加一个\0。
参考代码(库函数实现):

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
    char arr[] = "abcdefghi";
    char *ret=strncpy(arr, "pppp",4);
    //char *ret=strncpy(arr, "pppp",7);
    printf("%s\n", ret);
    system("pause");
    return 0;
}

运行(源字符串的长度大于等于count):
这里写图片描述
运行(源字符串的长度小于count):
这里写图片描述
模拟实现strncpy
代码:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
char* my_strncpy(char *dest, const char *src, size_t count)
{
    char *ret = dest;
    assert(dest);//断言,如果为空指针,则不执行后面的语句。
    assert(src); //断言,如果为空指针,则不执行后面的语句。
    while (count--) //执行count次循环
    {
        if (*src != '\0') //count<源字符串长度,拷贝字符串
        {
            *dest = *src;
            src++;
            dest++;
        }
        else        //count>源字符串长度,拷贝完字符串之后,
     {
        *dest = '\0';//在目标后面追加0
         return ret;
              }
    }
    return ret;
}
int main()
{
    char arr[] = "abcdefghi"; 
    char *ret = my_strncpy(arr, "pppp", 3);
    //char *ret = my_strncpy(arr, "pppp", 7);
    printf("%s\n", ret);
    system("pause");
    return 0;
}

运行(源字符串的长度大于等于count):
这里写图片描述
运行(源字符串的长度小于count):
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值