字符串部分函数的重写和memcpy、memmov

(这里面的字符串有些是没有进行是否为空的判断,自行参考一下。assert()断言是预告版内容,比较草率,没有详解)

1.实现strcpy

     这个函数是一个复制的作用。在实际运用中应该就是需要需要修改某一个字符串,但是又要保留原有数据,这就需要把它复制到另一个字符串里面。

//C语言

//模拟实现strcpy

//strcpy的格式是
//strcpy(str,str2)
//将str整个复制到str2
char* strcpy1(char* str,const char* str2) {
	char* start = str;        //指向被复制字符串的头个元素的指针
	char* start2 = str2;      //指向要复制字符串的投个元素的指针
        int leng = strlen(str);
	while (start!=(str+leng+1)) {//一定要注意俩字符串的长度啊。因为字符串后面还有个'\0'
		*start2 = *start;    
		++start;
		++start2;
	}
	return str2;
}

2.实现strcat

这个函数是连接两个字符串的。它的用法简单直观,所以直接奉上代码

//C语言

//模拟实现strcat
char* my_strcat( char* str, const char* str2) {
	assert(str);
	assert(str2);
	
	char* p3 = str;
	while (*str != '\0') {
		
		++str;
		
	}
	while (*str2!='\0') {
		

			*str = *str2;
			++str;
			++str2;
		
	}
	*str = '\0';//这里注意
	return p3;
}

3.实现strstr

这个函数是用来判断一个字符串是不是另一个字符串的字串。下面的代码怕是有点不好理解。

int my_strstr(char* str1,char* str2) {
//先假设str2是str1的字串
	char* p1 = str1;
	char* p2 = str2;
	char* flag = str1;//这都是指向第一个元素的指针。这个是标记用的。后面见
		
	if (*p2 == '\0'){//如果子串直接是空。那就不用进行下去了。
		return 0; 
        }
		while (*p1) { //*p1到最后一个字符后退出循环,

			flag = p1; //见到标记。指向第一个元素
			p2 = str2; 

			while (*flag && *p2 && (*flag == *p2)) //要都不为空,且要俩指针的元素相等
			{ 
				flag++; 
				p2++; //指向下一个元素
			} 
				if (*p2 == '\0'){ //字串最后一个元素都匹配了,那就是字串了
					return 1; 
                                }

				++p1; //如果两个元素遇到不相等的,那就重新来比较,
            //第一个字符串的元素向下一个移动来匹配。而字串就回到第一个元素继续匹配
//这里举一个例子
//str1[]="bbcdefg"
//str2[]="bcde";
//第一个元素相等的,但是第二元素不等,这时候str1移动下一个元素,str2回到首位继续比较
//然后就相等了。总之这是为了防止字符串有重合的元素影响比较。
		} 
	return 0; //最后一个字符都没有匹配上,那就过分很了,不是子串
    }
}

4.实现strchr

这个函数是查找字符串中首次出现某个字符的位置,chr是character的缩写,应该是昂,然后这个应该好理解吧,这个函数返回的是一个位置哦,不是是否有这个字符。下面奉上代码。

//C语言
int my_strchr( const char* str,char ch) {
	char* p = str;        //指向首个元素char* pch = ch;
	int adress = 0;        //位置标记
	while (*p!=ch) {
		++p;
		++adress;
		if (*p=='\0') {
			return 0;
		}
	}
	return adress+1;        //+1是为了好看,因为字符是从第0个位置开始的,人从第一个开始数
}

5.实现strcmp

这是俩字符串的比较函数。cmp一看就是compare对吧。两个字符串自左向右逐个字符相比(按ASCII值大小相比较),直到出现不同的字符或遇'\0'为止。这里不是比较是否相同,还有这里面只能比较字符串,即可用于比较两个字符串常量,或比较数组和字符串常量,不能比较数字等其他形式的参数。敲黑板!注意一下昂。奉上代码

//C语言
int my_strcmp(const char* str1, const char* str2) {
	char* p1 = str1;
	char* p2 = str2;
	while (*p1==*p2) {
		++p1;
		++p2;
	}
	if (*p1<*p2) {
		return -1;
	}
	else if (*p1==*p2) {
		return 0;
	}
	else {
		return 1;
	}
}

6.实现memcpy

这也是拷贝的函数,但是这个点高级就是从源字符串起始位置开始拷贝指定个字节到目标字符串中。当你要拷贝大于原字符串长度的时候,也就是 n 大于原字符串长度,strncpy 会用 ‘\0’ 来填充,而 memcpy 则会在原字符串所在地址按照长度拷贝内存里的值,所以多余的字符是内存中不确定的值。这里的strncpy是strcpy的进阶。代码奉上

//语言
//实现memcp
void* my_memcpy(void* str2,void* str1,size_t num) {
	assert(str1);
	assert(str2);
	void* ret = str2;
	
	while (num--){
		*(char*)str2 = *(char*)str1;
		++(char*)str2;
		++(char*)str1;
	}
	return ret;
}

7.实现memmove

   这是memcpy的优化版。函数memcpy()   从source  指向的区域向dest指向的区域复制count个字符,如果两数组重叠,不定义该函数的行为。  
  而memmove(),如果两函数重叠,赋值仍正确进行。

//C语言
//实现memmove

void* my_memmov(void* copy,void* from,size_t num) {
	void* ret = copy;
	if ((char*)from <= (char*)copy || ((char*)from>(char*)copy + num)) {
		while (num--) {
			*(char*)copy = *(char*)from;
			copy = (char*)copy + 1;
			from = (char*)from + 1;
		}
	}
	else {//区间重合
		copy = (char*)copy + num - 1;
		from = (char*)from + num - 1;

		while (num--) {
			*(char*)copy = *(char*)from;
			copy = (char*)copy - 1;
			from = (char*)from - 1;

		}
	}
	
	return ret;
}

8、这里有几个字符串函数的处理函数,但是它们的用法和上面6和7差不多的。简单书写还原的函数。

//C语言
//1.模拟实现strncpy

#define  _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
char* my_strncat(char* dest,const char* sor,size_t num) {
	assert(dest);
	assert(sor);
	char* ret = dest;

	while (*dest!='\0')
	{
		++dest;
	}
	while (num--) {
		*dest = *sor;
		++dest;
		++sor;
		if (*sor=='\0')
		{
			break;
		}
	}
	*dest = '\0';
	return ret;
}
void main() {
	char str1[] = "abcdef";
	char str2[] = "ghijk";
	my_strncat(str1,str2,7);
	printf("%s\n",str1);
	system("pause");
}

//2.模拟实现strncat

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
char *my_strncpy(char *dest, const char *src, size_t n) {
	assert(dest);
	assert(src);
	char* ret = dest;
	while (n--)
	{
		*dest= *src;
		++dest;
		++src;
	}
	*dest = '\0';
	return ret;
}
void main() {
	char str1[] = "i am a student .";
	char str2[1024] = "0";
	my_strncpy(str2,str1,8);
	printf("%s\n",str2);
	system("pause");
}

//3.模拟实现strncmp 

#include<stdio.h>
#include<stdlib.h>
int my_strncmp(const char* str1,const char* str2,size_t num) {
	while (--num)
	{
		if (*str1==*str2) {
			++str1;
			++str2;
		}
		else{
			break;
		}
	}
	if (*str1>*str2) {
		return -1;
	}
	else if (*str1==*str2) {
		return 0;
	}
	else {
		return 1;
	}
}
void main() {
	char str1[] = "compare";
	char str2[] = "computer";
	printf("%d\n",my_strncmp(str1,str2,4));
	system("pause");
}

 

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值