几个str,mem函数的模拟实现

#include<stdio.h>
#include<assert.h>
void* mymemmove(void* a, const void* b, int n) {
	assert(a != NULL && b != NULL && n != 0);
	int i = 0;
	char* a1 = (char*)a;
	const char* b1 = (const char*)b;
	if (b1 <= a1 && a1 <= b1 + n) {//当被a1的内存首地址在b1到b1之间时,cpy会发生错误,此时倒着cpy就可以解决问题
		while (n > 0) {
			a1[n - 1] = b1[n - 1];
			n--;
		}
		return a;
	}
	while (i < n) {
		a1[i] = b1[i];
		i++;
	}
	return a;
}
int main() {
	char a[] = "maonlnpeng shizhuhhhhhhh";
	mymemmove(a + 17, a + 14, 7);
	puts(a);
	return 0;
}


//memmove和memcpy的差别就是memmove函数处理的源内存块和目标内存块是可以重叠的.
//如果源空间和目标空间出现重叠,就得使用memmove函数处理.


//#include<stdio.h>
//#include<assert.h>
函数memcpy从b的位置开始向后复制n个字节的数据到a的内存位置。
这个函数在遇到 '\0' 的时候并不会停下来。
如果b和a有任何的重叠,复制的结果都是未定义的.
//typedef struct test {
//	char name[1024];
//	int num;
//}test;
//void* mymemcpy(void* a,const void* b,int n){
//	assert(a != NULL && b != NULL&&n!=0);
//	int i = 0;
//	char* a1 = (char*)a;
//	const char* b1 = (const char*)b;
//	while (i<n){
//		a1[i] = b1[i];
//		i++;
//	}
//}
//int main() {
//	test a = { "sca",100 };
//	test b = { "bf",0 };
//	mymemcpy(&a,&b,1);
//	printf("%s %d", a.name, a.num);
//	return 0;
//}


//#include<stdio.h>
//#include<string.h>
//#include<assert.h>
//char* mystrstr(const char* a, const char* b) {
//	assert(a != NULL && b != NULL);
//	const char* black = a;
//	while (*black!='\0'){
//		const char* red = black;
//		const char* sub = b;
//		while (*red==*sub && *red!='\0'&& *sub!='\0'){
//			red++, sub++;
//		}
//		if (*sub == '\0') {
//			return black;
//		}
//		if (*red != *sub) {//这个条件可以省略
//			black++;
//		}	
//	}
//	return NULL;//第三种情况*red=='\0'&& *sub!='\0'
//}
//int main() {
//	char a[] = "mvadomlp shizhu";
//	char b[] = "mlp";
//	printf("%s", mystrstr(a, b));
//	//printf("%c", *strstr(a, b));
//	return 0;
//}

值得注意的是文档上的memcpy不能处理内存重叠情况,但在很多编译器上处理过后memcpy==memmove.

​
#define _CRT_SECURE_NO_WARNINGS
#include<string.h>
#include<stdio.h>
#include<assert.h>
//char* mystrcat(char* a,const char* b) {
//	assert(a != NULL&&b!=NULL);//assert是一个宏,条件不成立时直接使程序崩溃,成立则无事发生用于工作中判断异常请求等
//	int n = 0;
//	while (a[n]!='\0'){
//		n++;
//	}
//	int i = 0;
//	while (b[i]!='\0'){
//		i++;
//	}
//	for (int j = 0; j < i; j++,n++) {
//		a[n] = b[j];
//	}
//	return a;
//}


//int mystrcmp(const char* a, const char* b) {
//	assert(a != NULL && b != NULL);
//	int i = 0, j = 0;
//	while (a[i]!='\0'&&b[j]!='\0'){
//		if (a[i] != b[j]) {
//			return a[i] > b[i]?1:-1;
//		}
//		i++, j++;
//	}
//	if (a[i] != '\0') {
//		return 1;
//	}
//	else if (b[j] != '\0') {
//		return -1;
//	}
//	else
//		return 0;
//}


//char* mystrcpy(char* a, const char* b) {
//	assert(a != NULL && b != NULL);
//	int i = 0;
//	while (b[i]!='\0') {
//		a[i] = b[i];
//		i++;
//	}
//	a[i] = b[i];
//	return a;
//}


int mystrlen(const char* a) {
	assert(a != NULL);
	int i = 0;
	while (a[i]!='\0'){
		i++;
	}
	return i;
}
int main(){
	/*char a[1024] = "abcdef";
	char b[] = "ghijkl";
	printf("%s ", mystrcat(a, b));*/

	//char a[1024] = "abcdef";
	//char b[] = "abcdefg";
	//printf("%d ", mystrcmp(a, b));
	//printf("%d ",   strcmp(a, b));

	/*char a[1024] = "a";
	char b[1024] = "abcdefgasjdkf";
	printf("%s ",mystrcpy(a, b));*/

	char a[1024] = "abcdef";
	printf("%d ", mystrlen(a));
	return 0;
}

​

strtok有使用缺陷和笔试也少考,在这里不做过多了解.

#include<assert.h>
#include<stdio.h>
int mystrncmp(const char* a, const char* b,int n) {
	assert(a != NULL && b != NULL && n != 0);
	int i = 0;
	while (a[i]!='\0'&&b[i]!='\0'&&i<n){
		if (a[i] != b[i]) {
			return a[i] > b[i] ? 1 : -1;
		}
		i++;
	}
	if (a[i] != '\0') {
		return 1;
	}
	if (b[i] != '\0') {
		return -1;
	}
	else
		return 0;
}
int main() {
		char a[1024] = "afs";
		char b[] = "afsf";
		printf("%d",mystrncmp(a,b,9));
		return 0;
}

//#include<assert.h>
//#include<stdio.h>
//char* mystrncat(char* a,const char* b,int n) {
//	assert(a != NULL && b != NULL && n != 0);
//	int i = 0;
//	while (a[i]!='\0'){
//		i++;
//	}
//	int j = 0;
//	while (j<n){
//		a[i] = b[j];
//		j++,i++;
//	}
//	return a;
//}
//int main() {
//		char a[1024] = "mm";
//		char b[] = "afas";
//		printf("%s",mystrncat(a,b,9));
//		return 0;
//}


//#include<assert.h>
//#include<stdio.h>
//typedef unsigned long size_t;//size_t在标准库用来表示一个整数,一般是八个字节,不过使用他容易溢出(因为unsigned,比如1-2)
//char* mystrncpy(char* a,const char* b,size_t n) {
//	assert(a != NULL && b != NULL && n != 0);//在线oj不能用assert
//	int i = 0;
//	while (b[i]!='\0'&&i<n){
//		a[i] = b[i];
//		i++;
//	}
//	//第一种情况i=n了,b[i]还没等于\0
//	if (i == n) {
//		return a;
//	}
//	//第二种情况,b[i]等于\0,i还没等于n
//	if (i < n) {
//		while (i<n){
//			a[i] = '\0';
//			i++;
//		}
//		return a;
//	}
//}
//int main() {
//	char a[1024] = "mmafaagdgda";
//	char b[] = "afas";
//	printf("%s",mystrncpy(a,b,9));
//	return 0;
//}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值