C语言字符串函数练习

1、模拟实现strcmp

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<assert.h>
int Strcmp(const char* str1, const char* str2) {
        assert(str1 != NULL);
        assert(str2 != NULL);
	int i = 0;
	for (; str1[i] != '\0'&&str2 != '\0'; ++i) {
		if (str1[i] < str2[i]) {
			return -1;
		} else if (str1[i] > str2[i]) {
			return 1;
		} else {

		}
	}
	if (str1[i] < str2[i]) {
		return -1;
	} else if (str1[i] < str2[i]) {
		return 1;
	} else {
		return 0;
	}
}
int main() {
	char arr[1024] = "abcde";
	char brr[1024] = "abc";
	int ret = Strcmp(arr, brr);
	if (ret == 0) {
		printf("arr == brr\n");
	} else if (ret < 0) {
		printf("arr<brr\n");
	} else {
		printf("arr>brr\n");
	}
	system("pause");
	return 0;
}

2、模拟实现strcpy

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<assert.h>
char* Strcpy(char* dest, const char* src) {
	assert(dest != NULL);
	assert(src != NULL);
	for (int i = 0; dest[i] != '\0'; ++i) {
		dest[i] = src[i];
	}
	return dest;
}
int main() {
	char arr[1024] = "abcde";
	char brr[1024] = "drf";
	printf("%s\n",Strcpy(arr, brr)); 
	system("pause");
	return 0;
}

3、模拟实现strcat

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<assert.h>
char* Strcat(char* dest, const char* src) {
	assert(dest != NULL);
	assert(src != NULL);
	int i = 0;
	for (; dest[i] != '\0'; ++i);
	for (int j = 0; src[j] != '\0'; ++j, ++i) {
		dest[i] = src[j];
	}
	dest[i] = '\0';
	return dest;
}
int main() {
	char arr[1024] = "abcde";
	char brr[1024] = "drf";
	printf("%s\n", Strcat(arr, brr));
	system("pause");
	return 0;
}

4、模拟实现strstr

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<assert.h>
char* Strstr(const char* str1, const char* str2) {
	assert(str1 != NULL);
	assert(str2 != NULL);
	if (*str2 == '\0') {
		return NULL;
	}
	char* black_ptr = str1;//黑指针功能是记录从哪个位置找字符串子串
	while (*black_ptr != '\0') {
		//红指针帮我们完成具体的子串比较
		char* red_ptr = black_ptr;
		char* sub_ptr = str2;
		while (*red_ptr != '\0'&&*sub_ptr != '\0'&&*red_ptr == *sub_ptr) {
			++*sub_ptr;
			++*red_ptr;
		}
		if (*sub_ptr == '\0') {
			return black_ptr;
		}
		++black_ptr;
	}
	return NULL;
}
int main() {
	char arr[1024] = "abce";
	char brr[1024] = "bcd";
	char* ret = Strstr(arr, brr);
	printf("%p\n", arr);
	printf("%p\n", *ret);
	system("pause");
	return 0;
}

5、模拟实现strchr

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<assert.h>
const char* Strchr(const char* str, int character) {
	assert(str != NULL);
	while (*str != '\0') {
		if (*str == character) {
			return str;
		}
		++str;
	}
	if (*str == '\0') {
		return NULL;
	}
}
int main() {
	char arr[1024] = "abcde";
	char input = 'g';
	printf("%p\n", arr);
	printf("%p\n", Strchr(arr, input));
	system("pause");
	return 0;
}

6、模拟实现memcpy

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<assert.h>
const void* Memcpy(void* dest, const void* src, size_t num) {
	assert(dest != NULL);
	assert(src != NULL);
	const char* psrc = (const char*)src;
	char* pdest = (char*)dest;
	for (size_t i = 0; i < num; ++i) {
		pdest[i] = psrc[i];
	}
	return dest;
}
int main() {
	char arr[1024] = "abcde";
	char brr[1024] = "def";
	printf("%s\n", Memcpy(arr, brr, sizeof(brr)));
	system("pause");
	return 0;
}

7、模拟实现memmove

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<assert.h>
void *Memmove(void *dest, const void *src, size_t num) {
	/*因为char类型为1字节,所以将数据转化为char*进行操作。并不是因为操作的对象是字符串*/
	assert(dest);
	assert(src);
	char* pdest = (char *)dest;
	const char* psrc = (const char *)src;
	if (pdest <= psrc && pdest >= psrc + num) {
		//正常情况下从前向后拷贝
	    while(n--){		
		*(pdest++) = *(psrc++);
	    }
         else {
            //当出现内存覆盖时从后向前拷贝	
	    while (num--) {
		 *(pdest + num) = *(psrc + num);
		}
	  }
	return dest;
}
int main() {
	char arr[1024] = "abcde";
	printf("%s\n", Memmove(arr + 1, arr, sizeof(arr[0]) * 5));
	system("pause");
	return 0;
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值