实现strcpy,strlin标准库函数的过程和思考

c语言提供了各种各样的标准库函数,使用时只需#include预处理指令调用这些库函数功能。

那么这些库函数到底是如何实现功能并适用几乎任何情况呢?

1.实现strcpy函数。

strcpy函数可以实现将字符串拷贝到目标数组中的功能。

strcpy(destination,source)

既然它是函数,想要进行操作就得传参然后通过指针得方式来实现,那么在source位置就需要给一个char * source得指针变量来接收字符串(其中字符串常量赋值给指针变量时传递的是字符串首元素的地址),然后通过功能将元素一个一个赋值给destination处定义的指针变量 char* dest(用来接受数组的首地址),最后将最后一个‘\0’赋值后结束.

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<windows.h>
#include<assert.h>
char* my_strcpy(char*dest,const char*soc)
{
	//先将各个元素进行赋值,直到前者被赋予\0.那么个根据while语句性质()内如果为o即停止
	char*a = dest;//防止返回值被破坏
	if (dest == soc)
	{
		return dest;
	}
	assert((soc!= NULL) || (dest != NULL));//使用断言宏来进行异常提示
	while ((*dest++ = *soc++)!='\0');//此处为赋值而不是判断大小
	return a;
}
	int main()
	{
		char arr[10] = { 0 };//数组在创建时若未大小会提示越界error
		my_strcpy(arr, "asdasd");
		printf("%s", arr);
		system("pause");
			return 0;
	}


解析:1.将my_strcpy函数得返回值类型设定为char*类型目的是为了实现链式访问。

          2.一个合格的程序需要有良好的健壮性和鲁棒性,以应对每次调用的问题和反馈,所以在if语句中先将dest和soc进行比较,如果地址相同,则直接返回目标。

           3.assert是一种define定义的宏——断言。其存在于assert.h头文件中,当()内条件为假时候反馈异常信息并提示错误。即如果在main函数中定义了一个空指针并把它传递给了函数,那么就会直接报错。


            4.运用单目操作符使得程序言简意赅,while()内0则为假,则通过赋值表达式的'\0'来判断

            5.返回dest的值即地址,实现链式访问。

            6.const char*soc意为soc使指向字符常量的指针,即可以改变p但是不能改变*p(这里仅指*p不能改变,如果这个内容通过其他方式改变了值,依然可行)若果p指向的内容,防止功能紊乱。(若const位于*后,那么则表示不能修改p所指向的地址,但是可以改变它所指向的值即*p

2.strlin函数的实现的三种方法

1.借助记数法


int my_strlin(const char*destsor)
{
	assert(NULL != destsor);
	int count = 0;
	while ('\0' != *destsor++)
	{
		count++;
	}
	return count;
}

2.不借助任何变量

int my_strlin(const char*destsor)
{
	assert(NULL != destsor);
	if ('\0' == *destsor)
	{
		return 0;
	}
	return(1 + my_strlin(++destsor));//函数每次调用其本身,使+1的办法累计字符的个数,直到遇到\0结束。
}

这个方法使用了函数递归,通过+1将每次非\0得结果累计

3.不借助变量不使用if while等语句(极简版)

int my_strlin(const char*destsor)
{
	assert(NULL != destsor);
	return  *destsor?(1 + my_strlin(++destsor)):0;//使用三目操作符
}
int main()
{
	char arr[] = "asdasd";
	int ss = my_strlin(arr);
	printf("%d", ss);
	system("pause");
	return 0;
}
三目操作符原理,零是假,任何非零值为真,所以直接将*destsor置于左侧


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值