模拟实现strcpy,strcat,strstr,strchr,strcmp,memcpy,memmove

一、模拟strcpy

//模拟strcpy
#include<stdio.h>
#include<stdlib.h>
#include <assert.h>
char *my_strcpy(char *dest, const char *src) {
	assert(dest != NULL);
	assert(src != NULL);
	char *ret = dest;
	while (*dest&&*src){
		*dest = *src;
		dest++;
		src++;
	}
	return ret;
}

int main() {
	char a[] = "abcd";
	char b[] = "123";
	char *ret = my_strcpy(a, b);
	puts(ret);
	system("pause");
	return 0;
}

二、模拟strcat

//模拟strcat
#include<stdio.h>
#include<stdlib.h>
#include <assert.h>
char *my_strcat(char *dest, const char*src) {
	assert(dest != NULL);
	assert(src != NULL);
	char *ret = dest;
	while (*dest){
		dest++;
	}
	while (*src){
		*dest = *src;
		dest++;
		src++;
	}
	*dest = '\0';
	return ret;
}

int main() {
	char a[] = "abcd";
	char b[] = "123456";
	char *ret = my_strcat(a, b);
	puts(ret);
	system("pause");
	return 0;
}

三、模拟strstr

//模拟strstr
#include<stdio.h>
#include<stdlib.h>
#include <assert.h>
char *my_strstr(const char *str1, const char *str2) {
	assert(str1 != NULL);
	assert(str2 != NULL);
	char *tstr1 = str1;
	char *tstr2 = str2;
	while (*tstr1){
		char *flag = tstr1;
		while (*tstr1 == *tstr2 && *tstr1){
			tstr1++;
			tstr2++;
		}
		if (!*tstr2){
			return flag;
		}
		if (!*tstr1){
			return NULL;
		}
		tstr1++;
	}
	return NULL;
}

int main() {
	char a[] = "abcd123";
	char b[] = "bc";
	char *ret = my_strstr(a, b);
	puts(ret);
	system("pause");
	return 0;
}

四、模拟strchr

//模拟strchr
#include<stdio.h>
#include<stdlib.h>
char *my_strchr(const char *str, char c) {
	if (*str==NULL){
		return NULL;
	}
	char *p = (char *)str;
	while (*p){
	if (*p==c){
		return p;
	}
	p++;
	}
	return NULL;
}

int main() {
	char str[] = "1234567";
	char c = '3';
	char *ret = my_strchr(str, c);
	printf("%p\n", str);
	printf("%p\n", ret);
	system("pause");
	return 0;
}

五、模拟strcmp

//模拟strcmp
#include<stdio.h>
#include<stdlib.h>
#include <assert.h>
char *my_strcmp(const char *dest, const char *src) {
	assert(dest != NULL);
	assert(src != NULL);
	while (*dest == *src) {
		if (*dest=='\0'){
			return 0;
		}
		dest++;
		src++;
	}
	return *dest - *src;
}

int main() {
	char str1[] = "abcdef";
	char str2[] = "abcadf";
	char ret = my_strcmp(str1, str2);
	printf("%d\n", ret);
	system("pause");
	return 0;
}

六、模拟memcpy

//模拟memcpy
#include<stdio.h>
#include<stdlib.h>
void *my_memcpy(void *dest, const void *src, size_t n) {
	char *tmp = (char *)dest;
	char *s_src = (char *)src;
	while (n--){
		*tmp++ = *s_src++;
	}
	return dest;
}


int main() {
	char str1[] = "123456789";
	my_memcpy(str1, str1+2, 4);  //能正确显示
	//my_memcpy(str1 + 2, str1, 4);  //内存重叠
	printf("%s\n", str1);
	system("pause");
	return 0;
}

七、模拟memmove

//模拟memmove
#include<stdio.h>
#include<stdlib.h>
void *my_memmove(void *dest, const void *src, size_t n) {
	char *s_dest = (char *)dest;
	char *s_src = (char *)src;
 if (s_dest>s_src&&s_src+n>s_dest){
	 s_dest = s_dest + n - 1;
	 s_src = s_src + n - 1;
	 while (n--){
		 *s_dest-- = *s_src--;
	 }
 }
 else
 {
	 while (n--){
		 *s_dest++ = *s_src++;
	 }
 }
 return dest;
}

int main() {
	char str1[] = "123456789";
	//my_memmove(str1, str1 + 2, 4);  //能正确显示
	my_memmove(str1 + 2, str1, 4);  //memcpy内存重叠的情况也能正确显示
	printf("%s\n", str1);
	system("pause");
	return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. atof(): 将字符串转换为double类型的值。 例如: ```c++ char str[] = "3.14"; double num = atof(str); printf("%f", num); ``` 结果为:3.140000 2. atoi(): 将字符串转换为int类型的值。 例如: ```c++ char str[] = "1234"; int num = atoi(str); printf("%d", num); ``` 结果为:1234 3. atol(): 将字符串转换为long类型的值。 例如: ```c++ char str[] = "1234567"; long num = atol(str); printf("%ld", num); ``` 结果为:1234567 4. strtod(): 类似于atof(),将字符串转换为double类型的值。 例如: ```c++ char str[] = "3.14"; double num = strtod(str, NULL); printf("%f", num); ``` 结果为:3.140000 5. strtol(): 将字符串转换为long类型的值,同时支持指定转换的基数(例如10进制、16进制等)和错误检查。 例如: ```c++ char str[] = "0110"; long num = strtol(str, NULL, 2); printf("%ld", num); ``` 结果为:6 6. strtoul(): 类似于strtol(),不过返回的是无符号的long类型。 例如: ```c++ char str[] = "0xA"; unsigned long num = strtoul(str, NULL, 16); printf("%lu", num); ``` 结果为:10 7. memset(): 将一段内存区域设置为指定的值。 例如: ```c++ char str[10]; memset(str, 'a', sizeof(str)); printf("%s", str); ``` 结果为:aaaaaaa 8. memcpy(): 将一段内存区域的内容复制到另一段内存区域。 例如: ```c++ char src[] = "hello"; char dst[10]; memcpy(dst, src, sizeof(src)); printf("%s", dst); ``` 结果为:hello 9. memmove(): 和memcpy()类似,但是保证在有重叠的情况下会正确工作。 例如: ```c++ char str[] = "hello"; memmove(str + 2, str, 3); printf("%s", str); ``` 结果为:hehlo 10. memcmp(): 比较两段内存区域的内容是否相等。 例如: ```c++ char str1[] = "hello"; char str2[] = "Hello"; int result = memcmp(str1, str2, 5); printf("%d", result); ``` 结果为:32(h和H的ASCII码差值) 11. memchr(): 在一段内存区域中搜索指定的字符,并返回指向该字符的指针。 例如: ```c++ char str[] = "hello"; char* ptr = (char*)memchr(str, 'l', 5); printf("%s", ptr); ``` 结果为:ll 12. strcpy(): 将一个字符串复制到另一个字符串。 例如: ```c++ char src[] = "hello"; char dst[10]; strcpy(dst, src); printf("%s", dst); ``` 结果为:hello 13. strncpy(): 类似于strcpy(),不过只会复制指定长度的字符。 例如: ```c++ char src[] = "hello"; char dst[10]; strncpy(dst, src, 3); dst[3] = '\0'; printf("%s", dst); ``` 结果为:hel 14. strcat(): 将一个字符串附加到另一个字符串的末尾。 例如: ```c++ char str1[] = "hello"; char str2[] = "world"; strcat(str1, str2); printf("%s", str1); ``` 结果为:helloworld 15. strncat(): 类似于strcat(),不过只会附加指定长度的字符。 例如: ```c++ char str1[] = "hello"; char str2[] = "world"; strncat(str1, str2, 3); printf("%s", str1); ``` 结果为:helloworld 16. strcmp(): 比较两个字符串是否相等。 例如: ```c++ char str1[] = "hello"; char str2[] = "world"; int result = strcmp(str1, str2); printf("%d", result); ``` 结果为:-15 17. strncmp(): 类似于strcmp(),不过只会比较指定长度的字符。 例如: ```c++ char str1[] = "hello"; char str2[] = "world"; int result = strncmp(str1, str2, 3); printf("%d", result); ``` 结果为:0 18. strchr(): 在一个字符串中搜索指定的字符,并返回指向该字符的指针。 例如: ```c++ char str[] = "hello"; char* ptr = strchr(str, 'l'); printf("%s", ptr); ``` 结果为:llo 19. strrchr(): 类似于strchr(),不过会从字符串的末尾开始搜索。 例如: ```c++ char str[] = "hello"; char* ptr = strrchr(str, 'l'); printf("%s", ptr); ``` 结果为:lo 20. strstr(): 在一个字符串中搜索指定的子字符串,并返回指向该子字符串的指针。 例如: ```c++ char str[] = "hello world"; char* ptr = strstr(str, "world"); printf("%s", ptr); ``` 结果为:world
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值