(C语言)strcpy详解与模拟实现与strncpy详解与模拟实现

本文详细解释了C语言中的strcpy和strncpy函数,包括它们的作用、头文件使用、复制过程以及特殊情况下可能遇到的问题,如内存溢出和堆栈破坏。同时提供了模拟实现的代码示例。
摘要由CSDN通过智能技术生成

目录

1. strcpy详解

1. 1trcpy函数的特殊情况

1.2 strcpy模拟实现:

实现方法1:

实现方法2:

2. strncpy函数详解

2.1 strncpy函数特殊情况:

2.2 strncpy函数模拟实现:


1. strcpy详解

作用:完成字符串的复制。

头文件:<string.h>

destination是字符串要复制到的地点,source是字符串的来源,返回值是destination

演示:

1. 1trcpy函数的特殊情况

情况一:arr2的空间无法装完要拷贝的内容

在打印时遇到arr2外部的\0时打印结束,可见拷贝时arr2外部的内容也被更改。并且出现可警告如下:

显示arr2外部的堆栈已被破环。

情况二:

可见strcpy在复制时在复制的最后一个字符后面加了\0,

我们看到arr2中的值时也看到arr2后面的‘x’没有被更改。

1.2 strcpy模拟实现:

实现方法1:

#include <assert.h>

char* my_strcpy(char* dest, const char* sour)
{
    assert(*dest != 'NULL');
    assert(*sour != 'NULL');
    char* p = dest;
    while (*sour != '\0')
    {
        *dest = *sour;
        dest++;
        sour++;
    }
    *dest = *sour;
    return p;
}

int main()
{
    char arr1[] = "abedefg";
    char arr2[10] = { 0 };
    char* arr = my_strcpy(arr2, arr1);
    printf("%s\n", arr);
    printf("%s\n", arr2);
    return 0;
}

这种方式是比较麻烦低级的一种写法,下面我们看一个简单的写法。

实现方法2:

#include <assert.h>

char* my_strcpy(char* dest, const char* sour)
{
    assert(dest != 'NULL');
    assert(sour != 'NULL');
    char* p = dest;
    while (*dest++ = *sour++)
    {
        ;
    }
    return p;
}

++会在完成解引用并赋值后对dest和sour再进行+1,使指针指向了下一个地址,当sour解引用后是\0时,不仅完成了赋值,并且等式返回的就是sour解引用后的值0,whlie循环结束。

2. strncpy函数详解

头文件<string.h>

相比strcpy多了一个参数unm,表示要拷贝的字符个数,可以指定要拷贝的字符串个数。

演示:

2.1 strncpy函数特殊情况:

情况一:

可见strncpy函数没有在结尾拷贝\0,所以arr2后面的x也打印出来了

情况二:

若num参数大于arr1的长度,则会向strcpy函数一样,在拷贝的结尾加上\0,考完这个\0后就不会再拷贝其他内容。再如下面的示例;

arr1\0后面还有元素,但是不影响拷贝完\0后停止拷贝。

情况三:

和strcpy函数的情况一类似,同样arr2外部堆栈被破环。

2.2 strncpy函数模拟实现:

#include <assert.h>
char* my_strncpy(char* dest, const char* sour, int num)
{
	assert(dest && sour);
	char* p = dest;
	while (num && *sour != '\0')
	{
		num--;
		*dest = *sour;
		dest++;
		sour++;
	}
	if (num)
	{
		*dest = '\0';
	}
	return p;
}

这样实现和strncpy函数的效果一样,特殊情况也相同,

当然也可以用for循环来实现函数:都是可以的在这里就不展示了,有疑问可以在评论区提问》

感谢观看,谢谢支持

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值