【C语言】自定义编写strcpy函数、strcat函数、substr函数、stoi函数

1.strcpy拷贝函数

#include<string.h>
char* strcpy(char *dst,char const *src);  

C语言本身有自己的拷贝字符串,该函数接收两个参数,一个是源字符数组,一个是目标字符数组。调用该函数一定要保证dst字符数组的空间足够大,不然就会产生错误。该函数会把src的‘\0’也复制过去,并返回第一个参数的副本。下面要自己去实现该函数:

char* strcpy(char* dst, const char* src)
{
	//保证函数参数的正确性
	if (dst == NULL || src == NULL)
            return NULL;
	char* ret = dst;
	while ((*dst++ = *src++) != '\0')
		;
	return ret;    //返回目标字符串
}

//将src字符串部分拷贝到dst当中去
char* strcpy(char* dst, const char* src, int len )
{
    char* ret = dst;
    while (len-- && (*dst++ = *src++) != '\0') {
        ;
    }
        
    return ret;    //返回目标字符串
}

//示例
char* a[30];
char* b[] = "123456"
strcpy(a, b);

第一个函数是将src全部拷贝过去,第二个函数是将src部分拷贝过去。dst++和src++里面的++是后置自增运算符,代表先完成赋值运算,再进行自增,并且赋值运算符返回就是成功赋的值,所以可以拿来做判断。当*dst = *src = ‘\0’时,才会跳出循环,所以这里成功把’\0’拷贝过去了,这一步很重要。如果dst缺少一个‘\0’,调用printf函数或者sizeof函数之类时候就会出现问题。

第二个函数在前面新增了长度len的判断,每进行一次拷贝,len的数值就减1,直到减到零不满足判断条件。这里隐藏着第二个意思,也就是当src的长度小于len,首先不满足的是后面那个条件。

2.strcat拼接函数

#include<string.h>
char* strcat(char *dst,char const *src);  

char* strcat(char* dst, const char* src)
{
	//保证函数参数的正确性
	if (dst == NULL || src == NULL)
            return NULL;

    char* ret = dst;
    while (*dst != '\0')    //循环结束后,dst指向‘\0’
        dst++;
    
    while ((*dst++ = *src++) != '\0');
    return ret;    //返回目标字符串
}

//示例
char* a[30] = "abc";
char* b[] = "123456"
strcat(a, b);

该函数与拷贝函数大致相同,只是前面通过循环,先把dst指针指向dst字符数组的‘\0’,后面的赋值就会把这个覆盖掉,拼接src的字符进来。

3.字符串截取函数

char* substr(char* dst, const char* src, int start, int len)
{
    //保证函数参数的正确性
    if (dst == NULL || src == NULL)
            return NULL;

    char* ret = dst;
    while (start--)    //循环结束后,dst指向start
        src++;
    
    while (len-- && (*dst++ = *src++) != '\0');
    return ret;    //返回目标字符串
}

C++语言自带substr函数,也就是截取字符串。函数参数start代表截取的起始位置,len代表长度。先通过循环将src指针指向start的位置,然后进行len长度的赋值。

4.字符串转int函数

int stoi(const char *s) {
	int ret = 0;
	int flag = 1;
	if(*s == '-') {
		flag = -1;
		s++;
	}
	while(*s != '\0') {
		ret = ret*10 + *s - '0';
		s++;
	}
	return flag * ret;
}

5.特别说明

不知道大家是否有此疑问?前面函数内部将src、dst不断自增,参数又是指针传递,为什么函数返回之后,src、dst还是会指向字符数组的初始位置。这里涉及到函数的值传递和指针传递,实质上指针传递也是值传递的一种,只是我们传递的是指针的值。比如存在一个指针p = 0x0000a指向变量a,当p作为函数的参数,传递的值就是这个0x0000a,在函数内部编译器自动新建了一个副本p2保存0x0000a,我们可以通过p2去修改变量a的值。但是我们去修改p2指针本身的值,实质上修改的是副本的值,所以当函数结束之后,副本自动销毁,原来的p依旧没有发生改变。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值