【C语言】strlen,str(n)cmp,str(n)cpy,str(n)cat,strstr库函数的代码实现

你知道这些函数,在复制/追加字符串的时候会加上\0吗?

声明:代码里、0就是代表\0,只是不想转换成拼音而已。。。


#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <assert.h>
#include <string.h>
//1.模拟实现strlen
//size_t strlen(const char* str); 标准结构,记住返回值是无符号的

//size_t my_strlen(const char* arr)
//{
//	assert(arr);
//	char* start = arr;
//	unsigned int count = 0;
//	while (*start++)
//	{
//		count++;
//
//	}
//	return count;
//}
//int main()
//{
//	char arr[] = "abc\0de";
//	unsigned int ret = my_strlen(arr);
//	printf("%d\n", ret);
//}

//模拟实现strcpy  ,会拷贝、0
//char* strcpy(char* destination, const char* source);
//char* my_strcpy(char* destination, const char* source)
//{
// assert(destination&&source);
//	char* a = source;
//
//	//char* ret = source;
//
//	char* b = destination;
//	while (*b++ = *a++)
//	{
//		;
//	}
//	//return ret;
//
//	return source;  //实现的功能和return ret是一样的
//}
//int main()
//{
//	char arr1[] = "xxxxxxxxx";
//	char arr2[] = "abc\0d";
//	printf("%s\n",my_strcpy(arr1, arr2));  //abc
//
//}
//int main()
//{
//	char arr1[50] = "abcdhhh";
//	char arr2[] = "e\0fg";
//	strcpy(arr1, arr2);
//	printf("%s\n", arr1);
//}

//模拟实现strcat 不会把追加字符串的、0加上
//char* strcat(char* destination, const char* source);

//char* my_strcat(char* destination, const char* source)
//{
//	assert(destination && source);
//	char* start = destination;
//	while (*start)
//	{
//		start++;
//	}
//	while(*start++ = *source++)
//	{
//		;
//	}
//	return destination;
//}

//int main()
//{
//	char arr1[50] = "abcdhhh";
//	char arr2[] = "efg";
//	printf("%s\n", my_strcat(arr1, arr2));
//}

//int main()
//{
//	char arr1[50] = "abcdhhh";
//	char arr2[] = "e\0fg";
//	strcat(arr1, arr2);
//	printf("%s\n",arr1 );
//}

//模拟实现strcmp
//int strcmp(const char* str1, const char* str2);

//int my_strcmp(const char* str1, const char* str2)
//{
//	assert(str1 && str2);
//	while (*str1 == *str2)
//	{
//		if (*str1 == '\0')
//		{
//			return 0;
//		}
//		str1++; str2++;
//	}
//	return *str1 -* str2;
//}
//int main()
//{
//	char arr1[] = "abcde";
//	char arr2[] = "abcdf";
//	printf("%d\n", my_strcmp(arr1, arr2));
//}

//模拟实现strncat  不会追加、0
//char* strncat(char* destination, const char* source, size_t num);

//char* my_strncpy(char* destination, const char* source, unsigned int number)
//{
//	assert(destination && source);
//	char* strat = destination;
//	while(*strat)
//	{
//		strat++;
//	}
//	for (int i = 0; i < number; i++)
//	{
//		*strat = *source;
//	}
//	return destination;
//}
//int main()
//{
//	char arr1[50] = "abcd";
//	char arr2[] = "ef";
//	printf("%s\n", my_strncpy(arr1, arr2,1));
//}

//int main()
//{
//	char arr1[50] = "abcd";
//	char arr2[] = "ef";
//	strncat(arr1, arr2, 1);
//}

//模拟strncpy  不会复制、0
//char* strncpy(char* destination, const char* source, size_t num);

//char* my_strncpy(char* destination, const char* source, int number)
//{
//	assert(destination && source);
//	char* start = destination;
//	int count = 1;
//	while (*source )
//	{
//		*start = *source;
//		
//		if (count == number)
//			return destination;
//
//        count++;
//		start++; source++;
//	}
//	return destination;
//}
//int main()
//{
//	char arr1[] = "cbcd";
//	char arr2[] = "abcd";
//	printf("%s\n", my_strncpy(arr1, arr2, 3)); //abcd
//
//}

//模拟strncat 不会、0
//char* strncat(char* destination, const char* source, size_t num);
//char* my_strncat(char* destination, const char* source, unsigned int number)
//{
//	assert(destination && source);
//	char* start = destination;
//	while (*start)
//	{
//		start++;
//	}
//	int count = 0;
//	while (*source)
//	{
//		*start = *source;
//		count++;
//		if (count == number)
//		{
//			return destination;
//		}
//		start++; source++;
//	}
//	return destination;
//
//}
//int main()
//{
//	char arr1[20] = "abcd";
//	char arr2[] = "efghi";
//	printf("%s\n", my_strncat(arr1, arr2, 3));
//}

//int main()
//{
//	char arr1[20] = "abcd";
//	char arr2[] = "efghi";
//	strncat(arr1, arr2, 3);
//}

//模拟   strncmp                        
//int strncmp(const char* str1, const char* str2, size_t num);

//int my_strncmp(const char* str1, const char* str2, unsigned int number)
//{
//	int count = 1;
//	while (*str1 == *str2)
//	{
//		if (*str1 == '\0')
//		{
//			return 0;
//		}
//		str1++; str2++;
//		count++;
//		if (count == number)
//			return 0;
//	}
//	return *str1 - *str2;
//}
//int main()
//{
//	char arr1[] = "abcde";
//	char arr2[] = "abcdr";
//	printf("%d\n", my_strncmp(arr1, arr2, 4));
//}

//模拟strstr
//const char* strstr(const char* str1, const char* str2);
//char* strstr(char* str1, const char* str2); C语言只支持这个
//char* my_strstr(char* str1, const char* str2)
//{
//	assert(str1 && str2);
//	char* p = str1;
//	char* a = NULL;
//	char* b = NULL;
//	
//	while (*p)
//	{
//         a = p;
//		 b = str2;
//		while (*a++ == *b)
//		{
//			b++;
//		}
//      
//        if (*b == '\0')
//			return (char* )p;
//		if (*a == '\0')
//		{
//			return NULL;
//		}
//		p++;
//	}
//}
//int main()
//{
//	char arr1[] = "abcdabcdffff";
//	char arr2[] = "dab";
//	char* ret = my_strstr(arr1, arr2);
//	if (ret)
//		printf("找到了%s\n", ret);
//	else
//		printf("NO\n");
//}

其实只有strcpy会加上要拷贝字符串的\0,你发现了吗

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值