c字符串函数模拟实现

1、实现strlen
2、实现strcpy
3 、实现strcat
4 、实现strstr
5、实现strcmp
6 、实现strchr
#include<stdio.h>
#include<string.h>
#include<assert.h>
#include<Windows.h>


//模拟实现strlen的三种方式
//方式1:计数器方式
int my_strlen1(const char *str)
{
	int count = 0;
	while (*str){
		count++;
		str++;
	}
	return count;
}
//方式2:递归(不创建临时变量)
int my_strlen2(const char *str)
{
	if (!*str){
		return 0;
	}
	return 1 + my_strlen2(str + 1);
}
//方式3:指针-指针
int my_strlen3(const char *str)
{
	char *p = str;
	while (*p){
		p++;
	}
	return p - str;//尾-头
}

//模拟实现strcpy
char *my_strcpy(char *des, const char *src)
{
	assert(des);
	assert(src);//判断是否为空
	char *ret = des;
	while (*des = *src){//保证src的'\0'也被复制
		des++;
		src++;
	}
	return ret;//返回拷贝后的des
}

//模拟实现strcat
char *my_strcat(char *des, const char *src)
{
	assert(des);
	assert(src);
	char *ret = des;
	while (*des){//从des的'\0'开始复制
		des++;
	}
	while (*des = *src){
		des++;
		src++;
	}
	return ret;//返回拼接完成后的des
}

//模拟实现strstr(子串查找)
char *my_strstr(const char *des, const char *src)
{
	assert(des);
	assert(src);
	char *d = (char *)des;
	char *ds = NULL;
	char *s = (char *)src;
	while (*d){//如果在此字符串des已经判断到了'\0',则退出,未找到子串
		ds = d;
		s = src;
		while (*s && *ds && *ds == *s){
			ds++;
			s++;
		}
		if (!*s){//如果在此*s == 0,则子串已找到
			return d;
		}
		if (!*ds){//如果在此*ds == 0,则des已经找完,未找到子串
			return NULL;
		}
		//走到这说明while循环是因为*ds!=*s跳出的
		d++;
	}
}

//模拟实现strcmp
int *my_strcmp(const char *src, const char *des)
{
	assert(des);
	assert(src);
	int ret = 0;
	while (!(ret = *(unsigned char *)src - *(unsigned char *)des) && *des){//将较大几率不成立的条件放置前面判断
		//此处判断条件,没有判断*src为空:(原因)当判断条件1成立时说明src和des相等,此时会去判断条件2
		//当条件2成立,则退出,此时代表ret == 0(也可以说明此时src == 0;(src-des == 0))
		src++;
		des++;
	}
	if (ret < 0){
		ret = -1;
	}
	else if (ret > 0){
		ret = 1;
	}
	else{
		ret = 0;
	}
	return ret;
}

//查找字符串s中首次出现字符c的位置
char *my_strchr(const char *str, char ch)
{
	assert(str);

	char *tmp = str;
	while (*tmp != '\0' && *tmp != ch){
		tmp++;
	}
	if (*tmp == ch){
		return tmp;
	}
	else{
		return NULL;
	}
}

int main()
{
	/*char *str = "anxsdfj12";
	printf("%d\n", my_strlen1(str));
	printf("%d\n", my_strlen2(str));
	printf("%d\n", my_strlen3(str));*/

	/*char *src = "qweasdz765";
	char des[20];
	printf("%s\n", my_strcpy(des, src));*/

	/*char *src = "hjklg123";
	char des[20] = "asdf";
	printf("%s\n", my_strcat(des, src));*/

	/*char *src = "asdf";
	char *des = "qwasuitasdfcxnz";
	printf("%s\n", my_strstr(des, src));*/

	/*char *src = "abcdefg";
	char *des = "abcdekg";
	printf("%d\n", my_strcmp(src, des));*/

	char *str = "safjqla";
	char ch = 'q';
	printf("%s\n", my_strchr(str, ch));

	system("pause");
	return 0;
}

猜你喜欢

转载自blog.csdn.net/tec_1535/article/details/80372756