C语言进阶之旅(12)搞定字符串和内存函数

Posted 一个正直的男孩

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言进阶之旅(12)搞定字符串和内存函数相关的知识,希望对你有一定的参考价值。

这篇是如何使用库函数之少写点代码哈哈哈,为啥有库函数呢?,应为这个大家都用,且,频率还高,每次用还要自己实现,麻烦所以就诞生了库函数,方便😏

思维导图

在这里插入图片描述

字符串函数

strlen求字符串长度

  1. 计算\\0之前字符的个数
  2. 详细介绍

strcpy

  • 拷贝字符串到目标点
  • 就是把字符考到相应的你想要的地方
  • 然后返回被改变数组的地址
    在这里插入图片描述
	char* des2 = des;
	/*while (*con&&*des)
	{
		*des = *con;
		des++;
		con++;
	}*/
	while (*des++=*con++)
	{
		;
	}
	return des2;
}
int main()
{
	char arr1[20] = "ABCDE";
	char arr2[] = "FGHIJ";
	printf("%s",my_strcpy(arr1, arr2));
	return 0;
}

strncpy

  • 这个是可以指定你考过去的字符
  • 和strcpy比起来多了一个限制条件
  • 然后返回被改变数组的地址
    在这里插入图片描述
    while (限制条件--)
	{
		*des = *con;
		des++;
		con++;
	}

strcmp

  • 字符串对比
  • 每个对应的字符比较比的是ASSIC对应的值
  • 字符串相等,返回0,
  • 大则返回大于0的数
  • 小则返回小于0的数
    在这里插入图片描述
#include<assert.h>
int my_strcmp(const char *str1,const char* str2)
{
	assert(str1&&str2);
	while (*str1 == *str2&& *str1&& *str2)
	{
		str1++;
		str2++;
	}
	if (*str1 - *str2== 0)
	{
		return 0;
	}
	else
	{
		return *str1 - *str2;
	}


}
int main()
{
	char arr1[] = "ABCDE";
	char arr2[] = "CDEBB";
	int ret1 = strlen(arr1);
	int ret2 = strlen(arr2);
	if (ret1 == ret2)
	{
			int ret = my_strcmp(arr1, arr2);
			if (ret != 0)
			{
				printf("不等于\\n");
			}
			else
			{
				printf("等于");
			}
	}
	else
	{
		printf("不相等\\n");
	}
	
	
}

strncmp

  • 指定长度比较
  • 比较自己需要比较的字符串

实现只需要传参的时候多一个限条件,在写个循环条件是限制条件

在这里插入图片描述

int my_strcmp(const char *str1,const char* str2,int 限制条件)
{
	assert(str1&&str2);
	while(x)
	while (*str1 == *str2&& *str1&& *str2)
	{
		str1++;
		str2++;
	}
	if (*str1 - *str2== 0)
	{
		return 0;
	}
	else
	{
		return *str1 - *str2;
	}


}

strcat

  • 字符串追加
  • 前提空间要大
  • 从\\0开始改,然后会把arr2(源头)哪里的一直拷贝,\\0也是
    在这里插入图片描述
char*  my_strcat(char* des,const  char* sour)
{
	assert(des && sour);
	char* des2 = des;
	while (*des!='\\0')
	{
		des++;
	}
	while (*des!=*sour)
	{
		*des++ = *sour++;
	}
	return des2;
}
int main()
{
	char arr1[20] = "hello \\0########";
	char arr2[] = "world";
	//strcat(arr1, arr2);

	printf("%s",my_strcat(arr1, arr2));
	return 0;
}

strncat

  • 这个是受限制追加
  • 其实和上面一样多一个限制条件,和strncmp实现方法大同小异

strstr

  • 找基友函数哈哈哈怎么理解
  • 就是在一个字符串中找,另一个字符出是不是他的子串
    在这里插入图片描述
char* my_strstr(const char *dest,const char *cour)
{
	assert(dest && cour);
	const char* dest2 = dest;
	const char* cour2 = cour;

	if (*cour == '\\0')
	{
		return (char*)dest;
	}
	while (*dest2)
	{
		dest = dest2;
		cour2 =cour ;
		while (( *dest == *cour2)&&*dest&&*cour2)
		{
			dest++;
           cour++;
		}
		if(*dest==*cour&&*dest!='\\0')
		return (char*)dest2;
		dest2++;
	}
    return NULL;

}
int main()
{
	char arr1[] = "ABBC";
	char arr2[] = "CCC";
	char *ret =my_strstr(arr1,arr2);
    if (ret != NULL)
    {
        printf("是该字符的子串");
    }
    else
    {
        printf("不是该字符的子串");
    }


	return 0;
}

类似stcmp,却又不一样,他也是一一对比, 但是区别是,他要多次比较
在这里插入图片描述

strtok

  • 字符串切段
  • 就是咋找到相应的字符进行切段
  • 切段其实就是给那个地方放上一个\\0;

在这里插入图片描述

详细介绍
中文版在这里插入图片描述
英文
在这里插入图片描述

strerror

  • 翻译错误信息(erron)
    在这里插入图片描述
    例子:
    打开文件夹用的文件
int main() {
    FILE* pFile;
    pFile = fopen("unexist.ent", "r");
    if (pFile == NULL)
        printf("该错误是: %s\\n", strerror(errno));
    //errno: Last error number
    return 0;
}

应为我在文件中就没有创建这个文件

在这里插入图片描述

perroe

  • 直接翻译错误加打印,这不比方便面还方便吗哈哈
  • 输入那个需要打开的文件,即可😏

在这里插入图片描述

字符操作函数

  • 这个我感觉用处不是特别大,而且用法也简单
    在这里插入图片描述

内存函数

  • 上面的那些函数用处局限吗
  • 所以老大哥内存函数,管你是啥,都是老子小弟

memcpy

  • 和strcpy差不多,也是拷贝
  • 但是不一样的是实现方法
  • 要想通用还得用我char
  • 比较他只有一个字节,可谓小巧精干呀
    在这里插入图片描述
#include<stdio.h>
#include<string.h>
#include<assert.h>
//void* my_memcpy(void* dest, const void* sour, size_t sz)
//{
// assert(dest&&sour);
//	void* destm = dest;
//	while (sz--)
//	{
//		*(char*)dest = *(char*)sour;
//		dest=(char*)dest + 1;
//		sour=(char*)sour + 1;
//
//	}
//	return destm;
//}
void* my_memcpy(void* dest, const void* sour, size_t sz)
{
	assert(dest && sour);
	void* destm = dest;//返回值
	char* destt = (char*)dest;
	char* sourr = (char*)sour;
	while (sz--)
	{
		*destt++ = *sourr++;
	}
	return destm;

}
int main()
{
	int arr1[10] = { 1,2,3,4,5 };
	int arr2[] = { 6,7,8,9,10 };
	int sz = sizeof(arr2);
	my_memcpy(arr1, arr2, 20);//内存拷贝

	return 0;
}

这里需要注意的是强制类型转换和后置加加,强制类型转换他是零时的,你给他++他又没有那个性质了,就是类似buff时间到了的感觉,还有优先级考虑的话++的优先级比强制类型转换的高

memcmp

  • 内存比较
  • 已经是和strcmp差不多
  • 实现也是和也是,但是是一个字节一个字节的比
  • 看不懂这里的比较的话请看数据存储
    在这里插入图片描述

memmove

  • 这个是一拷贝自己的
    在这里插入图片描述
  • 模拟实现,这里有俩个问题需要解决
  • 怎么考
  • 从前往后,还是从后往前
    在这里插入图片描述
  • 情况1
    源头在后
    先cpy后面的,那么那个位置就可以随意改了,如果从前往后的话,那么后面的数据就被改变了
    在这里插入图片描述
  • 情况2:
    源头在前
    在这里插入图片描述
void* my_memmove(void *dest,void *sour,size_t num)
{
	assert(dest&&sour);
	void* destm = dest;

	char* destt = (char*)dest;
	char* sourr = (char*)sour;

	while (num--)
	{
		if (destt < sourr)//地址比较
		{
			*destt++ = *sourr++;
		}
		else if(destt >sourr)
		{
			*(destt + num) = *(sourr + num);//地址在减少的时候他们也在减少
			
		}
		else
		{
			*destt++ = *sourr++;
		}
	}
	return destm;
}
void print(int arr[],int sz)
{
	int i = 0;
	for ( i = 0; i <sz; i++)
	{
		printf("%d ", arr[i]);
	}
}
int main()
{
	
	int arr1[] = { 1,2,3,4,5,6,7,8, };
	int sz = sizeof(arr1) / sizeof(arr1[0]);//元素个数

   my_memmove(arr1+3, arr1,20);
	print(arr1,sz);
	printf("\\n");

	my_memmove(arr1, arr1 + 3, 20);
	print(arr1, sz);
	printf("\\n");
	return 0;
}

总结

  • 这些函数需要多用哦~~
  • 用多了就知道了
  • 温故知新,嗨~~

如果有错误请直接提出,评论区,私信,qq(1696912943),误人子弟可不好🤯

博主用的画图软件下载链接

持续更新中……………………

以上是关于C语言进阶之旅(12)搞定字符串和内存函数的主要内容,如果未能解决你的问题,请参考以下文章

C语言进阶之旅(留下的足迹)

C语言进阶之旅 (11.5)指针下 提升篇

我的C/C++语言学习进阶之旅转载:实现一个在JNI中调用Java对象的工具类

我的C/C++语言学习进阶之旅转载:实现一个在JNI中调用Java对象的工具类

我的C语言学习进阶之旅解决 Visual Studio 2019 报错:错误 C4996 ‘fscanf‘: This function or variable may be unsafe.(代码片段

我的C语言学习进阶之旅解决 Visual Studio 2019 报错:错误 C4996 ‘fscanf‘: This function or variable may be unsafe.(代码片段