C_函数and指针传参and返回值操作

本文介绍了作者仿照C标准库中的strcmp(),strcpy(),strcat()函数,自定义实现的字符串比较、拷贝和链接功能,包括内核代码的详细注释。

介绍

本文主要是借鉴#include<string.h>头文件中strcmp()函数,strcpy()函数,strcat()函数进行仿写。实现字符串对比,字符串拷贝,字符串链接。
文中有strcmp()函数的内核代码,都详细注释了。
PS:(如果有不懂别问我了,估计我也忘了。自行理解,顶多俩小时就能理清楚顺序)。

源码

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
//自己写的代码
int My_Strcmp(const char *str1, const char *str2)
{
/**************************************************************************
(*str1) && (*str1 == *str2)代码解释:
1、(*str1)是为了判断字符串是否结束,因为字符串最后一位是'\0'在ASCII码中是0
2、(*str1 == *str2)判断两个字符ASCII码是否相同,相同为 1,不相同为 0
3、&&(and)解释:在while中只要上面两个任意条件为0则结束循环
***************************************************************************/
	//判断字符串是否全部相同如果不相同则退出
	while ((*str1) && (*str1 == *str2))
	{
		str1++;//此处是指针++,读取单个字符。相当于数组arr[i+1],
		str2++;
	}

	//获取到str1 and str2记录最后一个字符在ASCII码中的数字进行对比
	if (*str1 > *str2)
		return 1;
	else if (*str1 < *str2)
		return -1;
	else 
		return 0;
}
//#include<string.h>中内核代码
int My_Strcmp_2(const char *str1, const char *str2)
{
	unsigned char c1, c2;

	while (1) {
		c1 = *str1++;//将*str1中字符的ASCII码值赋值到c1
		c2 = *str2++;//将*str2中字符的ASCII码值赋值到c2
		if (c1 != c2)//当c1不等于c2时判断为真
		{
			return c1 < c2 ? -1 : 1;//三目运算符判断c1 and c2大小
		}
		if (!c1)//当c1=0时判断为真,并且跳出循环
		{
			break;
		}
	}
	return 0;
}

//Strcpy()数组拷贝
char My_Strcpy(char *str1, char *str2)
{
	//判断数组是否为空
	if (str1 == NULL || str2 == NULL)
		return NULL;
	//copy *str2 到 *str1,采用单字符逐个拷贝
	while ((*str1++ = *str2++) != '\0');
	//返回一个数组地址
	return *str1;
}
//Strcat()数组链接
char My_Strcat(char *str1,char *str2)
{
	//判断数组是否为空
	if (str1 == NULL || str2 == NULL)
		return NULL;

//第一步:先遍历str1到末尾
	while (*str1 != '\0')*str1++;

//方法一:
	//第二步:将str2中的字符逐个拷贝到str1
	while ((*str1++ = *str2++) != '\0');
//方法二:调用数组拷贝
	//My_Strcpy(str1, str2);

	//第三步:返回str1一个数组地址
	return *str1;
}
void main()
{
	char arr[] = "Hella", brr[] = "Hella";//定义字符串
	char drr[40] = "world";
	//字符串对比
	int x = My_Strcmp(arr, brr);
	int s = My_Strcmp_2(arr, brr);
	printf("反馈结果%d %d\n", s,x);
	//字符串拷贝
	//PS:拷贝时,drr数组大小不能超过arr数组所定义的大小
	My_Strcpy(arr, drr);
	printf("反馈结果%s\n", arr);

	//字符串链接
	My_Strcat(drr, brr);
	printf("反馈结果%s\n", drr);
	system("pause");
}

运行结果

在这里插入图片描述

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值