【C语言】部分字符串函数的使用和实现

#define  _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<assert.h>
#include<string.h>
#include<errno.h>
//求字符串长度 strlen
//长度不受限制的字符串函数 strcpy strcat strcmp
//长度受限制的字符串函数 strncpy strncat strncmp



/*strlen实现三种方法*/
//1.计数器方法
//2.递归
//3.指针-指针
//int my_strlen(const char* str)
//{
//	int count = 0;
//	assert(str != NULL);
//	while (*str != '\0')//while(*str)
//	{
//		count++;
//		str++;
//	}
//	return count;
//}
//int main()
//{
//	//int len = my_strlen("abcdef");//拿到a的地址,到\0停止
//	char arr[] = { 'a','b','c','d','e','f' };
//	int len = strlen(arr);//随机值,因为\0在随机位置
//	//printf("%d\n", len);
//
//	//输出hehe,因为strlen定义的是无符号数 负数会被转为换为整数
//	if (strlen("abc") - strlen("abcdef") > 0)
//	{
//		printf("hehe\n");
//	}
//	else
//	{
//		printf("haha\n");
//	}
//	return 0;
//}

/*strcpy字符串拷贝*/
//char* my_strcpy(char* dest, const char* src)
//{
//	//保证指针有效性
//	assert(dest != NULL);
//	assert(src != NULL);
//	char* ret = dest;
//	//拷贝src指向的字符串到dest指向的空间,包含'\0'
//	while (*dest++ = *src++)
//	{
//		;
//	}
//	//返回目的空间的起止地址
//	return ret;
//}
//int main()
//{
//	char arr1[] = "abcdefghi";
//	char arr2[] = "bit";
//	//错误示范 char arr2[] = {'b','i'.'t'};
//	//错误示范 char *arr1[] = "abcdefghi"; //指针不能指向常量字符串
//	//strcpy(arr1,arr2);//(目的,源头) \0也会带过去,但后面依旧存在
//	char* arr = my_strcpy(arr1, arr2); 
//	printf("%s\n", arr);
//	return 0;
//}

/*
strcat字符串追加
源字符串必须以'\0'结束
目标空间必须足够大
目标空间必须可修改
*/
//char* my_strcat(char* dest,const char* src)
//{
//	assert(dest != NULL && src!= NULL);
//	char* ret = dest;
//	//1.找到目的地字符串的\0
//	while (*dest != '\0')
//	{
//		dest++;
//	}
//	//2.追加
//	while (*dest++ = *src++)
//	{
//		;
//	}
//	return ret;
//}
//int main()
//{
//	/*
//	//崩溃,空间不够大
//	char arr1[] = "hello";
//	char arr2[] = "world";
//	strcat(arr1, arr2);
//	printf("%s\n", arr1);
//	*/
//	//从\0开始追加,\0也会追加过去
//	char arr1[30] = "hello";
//	char arr2[] = "world";
//	/*strcat(arr1, arr2);*/
//	char* arr = my_strcat(arr1,arr2);
//	printf("%s\n", arr);
//
//	return 0;
//}

/*
strcmp字符串比较
第一个字符串大于第二个字符串,则返回大于0的数字
第一个字符串等于第二个字符串,则返回0
第一个字符串小于第二个字符串,则返回小于0的数字
*/
//int my_strcmp(char* str1,char* str2)
//{
//	assert(str1 && str2);
//	//比较
//	while(*str1 == *str2)
//	{
//		if (*str1 == '\0')
//			return 0;
//		str1++;
//		str2++;
//	}
//	if (*str1 > *str2)
//		return 1;
//	else
//		return -1;
//
//	//return *str1 - *str2; 
//}
//int main()
//{
//	char* p1 = "abc";
//	char* p2 = "abcdef";
//	/*int ret = strcmp(p1, p2);*/
//	int ret = my_strcmp(p1, p2);
//	printf("%d\n", ret);
//	return 0;
//}

/*
strncpy
拷贝num个字符从源字符串到目标空间
如果源字符串的长度小于num,则拷贝完源字符串之后,在目标的后面追加0,知道num个
*/
//char* my_strncpy(char* dest, const char* src, int num)
//{
//	assert(dest && src);
//	char* start = dest;
//	int len_src = strlen(src);
//	int ret = dest;
//	while (num && (*dest++ = *src++))
//	{
//		num--;
//	}
//	if (num)
//	{
//		while (--num)
//		{
//			*dest++ = '\0';
//		}
//	}
//	return (start);
//}
//int main()
//{
//	char arr1[10] = "abc";
//	char arr2[] = "hello bit";
//	/*strncpy(arr1, arr2, 4);*/
//	my_strncpy(arr1, arr2, 6);
//	printf("%s\n", arr1);
//	return 0;
//}

/*
strncat
*/
//char* my_strncat(char* dest, char* src, size_t num)
//{
//	assert(dest && src);
//	char* start = dest;
//	//1.找到目的字符串的\0
//	while (*dest++ != '\0')
//		;
//	//2.追加
//	while(num--)
//	{
//		if (!(*dest++ = *src++))
//			return (start);
//	}
//	*dest = '\0';
//	return (start);
//}
//int main()
//{
//	char arr1[30] = "hello";
//	char arr2[] = "world";
//	/*strncat(arr1, arr2, 3);*/
//	my_strncat(arr1, arr2, 3);
//	printf("%s\n", arr1);
//	return 0;
//}

/*
strcncmp
*/
//int main()
//{
//	const char* p1 = "abcdef";
//	char* p2 = "abcdqwer";
//	int ret = strncmp(p1, p2, 3);
//	printf("%d\n",ret);
//	return 0;
//}

/*
strstr - 查找字符串
*/
//char* my_strstr(const char* p1, const char* p2)
//{
//	assert(p1 && p2);
//	char* s1 = p1;
//	char* s2 = p2;
//	char* cur = p1;
//	if (p2 == '\n')
//		return p1;
//	while (*p1++)
//	{
//		s1 = cur;
//		s2 = p2;
//		while ((*s1 != '\0') && (*s2!='\0') && (*s1 == *s2))
//		{
//			s1++;
//			s2++;
//		}
//		if (*s2 == '\0')
//			return cur;
//		cur++;
//	}
//	return NULL;
//}
//int main()
//{
//	char* p1 = "abbbcdefabcdef";
//	char* p2 = "bbc";
//	/*char* ret = strstr(p1,p2);*/
//	char* ret = my_strstr(p1, p2);
//	if (ret == NULL)
//		printf("子串不存在\n");
//	else
//		printf("%s\n",ret);
//	return 0;
//}

/*
strtok
*/
//int main()
//{
//	char arr[] = "zpw@bitedu.tech";
//	char* p = "@.";
//	char buf[1024] = { 0 };
//	strcpy(buf,arr);
//	//切割buff中的字符串
//	
//	char* ret = NULL;
//	for (ret = strtok(arr,p);ret!=NULL;ret = strtok(NULL, p))
//	{
//		printf("%s\n", ret);
//	}
//	
//	//char* ret = strtok(arr, p);
//	//printf("%s\n", ret);
//	//ret = strtok(NULL,p);
//	//printf("%s\n", ret);
//	//ret = strtok(NULL, p);
//	//printf("%s\n", ret);
//	return 0;
//}

/*
strerror
*/
//int main()
//{
//	//错误码 错误信息
//	//0 - No error
//	//1 - Operation not permitted
//	//2 - No such file or directory
//	//......
//	//errno是一个全局的错误码变量
//	//当C语言的库函数在执行过程中,发生了错误,就会把对应的错误码,复制到error中
//	char* str = strerror(errno);
//	printf("%s\n", str);
//
//	return 0;
//}

//字符分类函数

//字符转换函数 tolower toupper
  • 10
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值