C语言实现常用字符串库函数(推荐)

 更新时间:2021年11月05日 10:41:34   作者:3 ERROR(s)  
这篇文章主要介绍了C语言实现常用字符串库函数,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

一、实现memcpy

将src所指向的内容拷贝到dst所指向的位置,拷贝len个字节。

  • memcpy是内存拷贝函数
  • memcpy在使用的时候不用考虑类型,以字节为单位进行拷贝
  • 遇到"\0"的时候不会停下,所以拷贝字符串的时候最好还是用strcpy,它更安全。
void *Mymemcpy(void * dst, const void * src, int len){
	void *ret = dst;
	assert(src);
	assert(dst);
	while (len--){
		*(char *)dst = *(char *)src;
		dst = (char *)dst + 1;
		src = (char *)src + 1;
	}
	return ret;
}
int main(){
	char str[100] = "ABCDE";
	Mymemcpy(str, str + 2, 2);
	printf("%s", str);
	system("pause");
	return 0;
}

在这里插入图片描述

但是当我们修改了测试用例后发现了如下结果

在这里插入图片描述

出现这种情况的原因很简单,因为我们源字符串的首地址低于目标字符串的首地址,当我们默认从左向右拷贝的时候第一个字符串会覆盖第二个字符串,所以出现了全A的情况,这就是内存重叠拷贝,要解决这个问题非常简单,只需要在拷贝之前加一个判断,如果源字符串的首地址低于目标字符串的首地址则我们从右向左拷贝,这样就可以完美解决这个问题。

二、memmove模拟实现

这里我们重复刚才的测试用例,发现加入了判断并从右向左拷贝了之后没有出现全A的情况。

void * Mymemmove(void * dst, const void *src, int len){

	char *_src = (char*)src;
	char *_dst = (char*)dst;
	if (_dst > _src&&_dst < _src + len){
		_dst = _dst + len - 1;
		_src = _src + len - 1;

		while (len--){
			*_dst = *_src;
			_dst--;
			_src--;
		}
	}
	else {
		while (len--){
			*_dst = *_src;
			_dst++;
			_src++;
		}
	}
	return dst;
}
int main(){
	char str[100] = "ABCDE";
	int len = strlen(str);
	memcpy(str+1, str , len);
	printf("%s", str);
	system("pause");
	return 0;
}

在这里插入图片描述

三、strlen的模拟实现

 1.计数器方法:

int Mystrlen(char * str){
	int count = 0;
	while (*str != 0){
		str++;
		count++;
	}
	return count;
}
int main(){
	char a[] = "dadai";
	int aa=Mystrlen(a);
	printf("%d", aa);
	system("pause");
	return 0;
}

2.递归方式:

int Mystrlen(char * str){
	if (*str == '\0'){
		return 0;
	}
	else return (1 + Mystrlen(str + 1));
}//1+1+1+1+1+0
int main(){
	char a[] = "dadai";
	int aa=Mystrlen(a);
	printf("%d", aa);
	system("pause");
	return 0;
}

3.利用指针实现:

int Mystrlen(char * str){
	char *p = str;
	while (*p){
		p++;
	}
	return (p - str);
}

int main(){
	char a[] = "dadai";
	int aa=Mystrlen(a);
	printf("%d", aa);
	system("pause");
	return 0;
}

四、strcpy的模拟实现

将src所指向的内容拷贝到dst所指向的存储单元。

char * Mycpy(char *dst, const char * src){
assert(dst != NULL && src !=NULL);
char *Mycpy = dst;
while((*dst++ = *src++) != '\0');
return Mycpy;
}
int main(){


	char src []= "daadok";
	char dst[10] ;
	Mycpy(dst, src);
	printf("%s", dst);
	system("pause");
	return 0;
}

五、strcmp的模拟实现

strcmp用于比较两个字符串是否相等,若相等则返回0,若dst>src则返回1,否则换回-1.

int Mystrcmp(const char* dst,const char * src){
	while (*dst&&*src&&(*dst == *src)){
		dst++;
		src++;
	}
	if (*dst > *src){
		return 1;
	}
	else if (*dst < *src){
		return -1;
	}
	else if (*dst == *src){
		return 0;
	}
}
int main(){
	char str1[] = "abcdefg";
	char str2[] = "dfd";
	int a=Mystrcmp(str1, str2);;
	printf("%d", a);
	system("pause");
	return 0;
}

六、strstr模拟实现

在dst中找到第一次与src相等的位置并输出这个位置之后dst所指向的内容。

char *mystrstr( const char *dst,const  char *src){
	assert(dst);
	assert(src);
	const char *p = dst;
	while (*p){
		const char *movep = p;
		const char *sp = src;
		while(*movep && *sp&& *sp== *movep){
			sp++;
			movep++;
		}
		if (*sp == '\0'){
			return (char *)p;
		}
		p++;
	}
	return NULL;
}
int main(){
	const char* dst = "abcd123456";
	const char*src = "cd";
	char *ret= mystrstr(dst, src);
	printf("%s", ret);
	system("pause");
	return 0;
}

在这里插入图片描述

七、模拟实现strcat

把src所指向的内容拼接到dst所指向内容的末尾。

char * mystrcat(char*dst, const char*src){
	assert(src);
	assert(dst);
	char*ret = dst;
	while (*dst){
		dst++;
	}
	while (*src){
		*dst = *src;
		dst++; src++;
	}
	return ret;
}
int main(){
	char dst[64] = "abcd";
	char *src = "efg";
	mystrcat(dst, src);
	printf("%s", dst);
	system("pause");
	return 0;
}

在这里插入图片描述

到此这篇关于C语言实现常用字符串库函数的文章就介绍到这了,更多相关C语言字符串库函数内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C语言详细分析讲解关键字goto与void的作用

    C语言详细分析讲解关键字goto与void的作用

    我们在C语言中经常会见到void,也会偶尔见到goto,那么C语言中既然有goto,为什么我们在代码中见的很少呢?在以前很多的项目经验中,我们得到这样一条潜规则:一般项目都是禁用goto的,程序质量与goto的出现次数成反比。自后也就造成了我们一般不会使用goto
    2022-04-04
  • 在C语言编程中设置和获取代码组数的方法

    在C语言编程中设置和获取代码组数的方法

    这篇文章主要介绍了在C语言编程中设置和获取代码组数的方法,分别为setgroups()函数和getgroups()函数的使用,需要的朋友可以参考下
    2015-08-08
  • C++实现LeetCode(101.判断对称树)

    C++实现LeetCode(101.判断对称树)

    这篇文章主要介绍了C++实现LeetCode(101.判断对称树),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • C++通过自定义函数求一元二次方程的根

    C++通过自定义函数求一元二次方程的根

    这篇文章主要介绍了C++通过自定义函数求一元二次方程的根,涉及C++数学运算相关技巧,非常简单实用,需要的朋友可以参考下
    2016-05-05
  • C语言实现停车管理系统

    C语言实现停车管理系统

    这篇文章主要为大家详细介绍了C语言实现停车管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • C语言进阶:指针的进阶(5)

    C语言进阶:指针的进阶(5)

    这篇文章主要介绍了C语言指针详解及用法示例,介绍了其相关概念,然后分享了几种用法,具有一定参考价值。需要的朋友可以了解下
    2021-09-09
  • C++函数三种传参形式(指针传递、引用传递、值传递)

    C++函数三种传参形式(指针传递、引用传递、值传递)

    不论是哪种参数传递方式,都有形参和实参之分,本文主要介绍了C++函数三种传参形式(指针传递、引用传递、值传递),具有一定的参考价值,感兴趣的可以了解一下
    2024-03-03
  • C++中静态库与动态库的使用示例

    C++中静态库与动态库的使用示例

    在C/C++中使用库的技术,库主要分为两种类型:静态库和动态库,本文主要介绍了C++中静态库与动态库的使用示例,具有一定的参考价值,感兴趣的可以了解一下
    2023-09-09
  • C语言中-a++和-++a运算顺序实例解析

    C语言中-a++和-++a运算顺序实例解析

    C语言中的a++和++a的区别在于混合表达式中运算符的处理顺序,下面这篇文章主要给大家介绍了关于C语言中-a++和-++a运算顺序的相关资料,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2022-11-11
  • C语言文件操作中 fgets与fputs 函数详解

    C语言文件操作中 fgets与fputs 函数详解

    这篇文章主要介绍了C语言文件操作中 fgets与fputs 函数详解的相关资料,需要的朋友可以参考下
    2017-06-06

最新评论