遇见她如春水映莲花
字符函数与字符串函数(2)
- 前言
 - 一、strcat
 - strncat
 
- 二、strcmp
 - strncmp
 - 在这里插入图片描述
 
- 三、strstr
 - 四、strtok
 - 五、strerror
 - 总结
 
前言
根据上期字符函数与字符串函数我们可以了解到字符函数与个别字符串函数的用法,
 那么接下来就开始对字符串函数的详细讲解(strcat、strcmp、strncpy、strncat、strncmp、strstr、)
以下是本篇文章正文内容,下面案例可供参考
一、strcat
1.深刻理解函数:
destination是追加目的地址,而source则是要追加的内容
返回值:char*
2.功能实现:
示例:(strcat是用于函数的追加)
3:模拟代码:
#include<stdio.h>
#include<assert.h>
#include<string.h>
char* my_strcat(char* dest, const char* source)
{
	char* p = dest;
	assert(source);
	assert(dest);
	//1.先找到目标空间的‘\0’
	while (*dest)
	{
		dest++;
	}
	//2.追加数据
	while (*source)
	{
		*dest = *source;
		dest++;
		source++;
	}
	return  p;
}
int main()
{
	char arr[20] = "abcdef";
	char arr1[20] = "bbbb";
	my_strcat(arr, arr1);
	printf("%s", arr);
	return 0;
}
 
代码难度一般,还是很好理解的!!!
strncat
- 了解:strncat与strcat的区别
 
通过对比我们可以很好的看出他们之中差了个size_t num,而这个num作用是可以让你想追加多少个就追加多少个
追加的长度由你来控制,同时也起到保护的作用避免不必要的事故
2.功能实现:
这里的strncat追加是怎么追加的呢?
通过调试可以得出以下结果:
1:在打印的最后一位的下一位加个‘\0’
2:如果字符串的长度小于追加长度那么就只会追加字符串(如图所示)
二、strcmp
1.理解函数:
返回值:int(类型)
用const来保证指针charstr1和str2不被修改
2.功能实现
strcmp功能是用于字符串比较
比较过程是一个一个相比(如图所示)
---------------------那么strcmp怎么告诉你大小呢?

我们可以通过返回值来确定大小
如:
如果第一个字符大于另外一个数组的第一个字符那么就会返回(>0)
等于返回(=0)
小于返回(<0)
3.函数模拟实现
int my_strcmp(char* dest, const char* source)
{
	assert(dest);
	assert(source);
	while (*dest == *source)
	{
		dest++;
		source++;
	}
	if (*dest > *source)
	{
		return 1;
	}
	else
	{
	    return -1;
	}
}
int main()
{
	char arr[20] = "abcdef";
	char arr1[20] = "bsdjfhf";
	int ret = my_strcmp(arr1, arr);
	printf("%d", ret);
}
 
strncmp
1:理解函数
相差了size_t num也就是指定内容比较
2.实现函数
int main()
{
	char arr[] = "abcdef";
	char arr1[20] = "abcds";
	int ret = strncmp(arr, arr1, 4);
	printf("%d", ret);
}
 
三、strstr
1.了解函数
! [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传](https://img-home.csdnimg.cn/images/20230724024159.png?origin_url=https%3A%2F%2Fimgblog.csdnimg.cn%2Fdirect%2Fa01330c4fe3c4f8783283a698c5c7ea5.png&pos_id=img-490bqnMB1330c4fe3c4f878285a6933c5c4ea5.png7
功能:查找字符串
如:
this is a student. 要查找 is
输出:为 is is a student
代码如下:
int main()
{
	char arr[] = "this is a student";
	char arr1[] = "is";
    printf("%s",strstr(arr, arr1));
	return 0;
}
 
2.strstr功能模拟
函数模拟有3种场景
1.第一种情况
my_strstr(“abcdef”,“bcd”);
一个一个比较
如果不相等,你们str1往后走一步(以此类推)
但是只有俩个指针来遍历的话是不够的
于是我们得出:要专门有个指针记录开始匹配的位置
2.第二种情况
这会有一次复杂的过程,str1指向的一个b,与str2比较但是还是找不到,那么我们就要让str指向第二个b时又与str2进行比较(所以又要俩个指针一个记录str2的初始位置,一个记录str1初始位置)
char* my_strstr(const char* dest, const char* src)
{
	assert(dest);
	assert(src);
	if (*src == '\0')//不能传空地址
	{
		return (char*)dest;
	}
	//1.abcdef\0 查找   bcd\0
	//2.abbbcdef\0 查找  bbc\0
	//3.abcdef\0   查找    bbq\0
	char* p = dest;
	char* s = dest;
	char* s1 = src;
	while (*p)
	{
		s = p;
		s1 = src;
		while(*s!='\0'&&*s1!='\0'&& *s == *s1)
		{
			s++;
			s1++;
	    }
		if (*s1 == '\0')
		{
			return p;
		}
		p++;
	}
	return NULL;
}
int main()
{
	char arr[] = "this is a student";
	char arr1[] = "is";
    printf("%s",strstr(arr, arr1));
	return 0;
}
 
四、strtok
1.理解函数
当strtok进行过一次之后,他会保留俩个指针一个是初始指针(头个指针),另外一个就是所标记点位置指针
如:
ret = strtok(arr, sep);
printf(“%s\n”, ret);
ret = strtok(NULL, sep);//这里传空值是因为strtok记录了标记点位置的指针返回值char*
2.函数实现
int main()
{
	char arr[] = "cwzhff@yeah.net";
	const char* sep = "@.";
	char arr2[30] = { 0 };
	strcpy(arr2, arr);
	char* ret = NULL;
	ret = strtok(arr, sep);
	printf("%s\n", ret);
	ret = strtok(NULL, sep);
	printf("%s\n", ret);
	ret = strtok(NULL, sep);
	printf("%s\n", ret);
}
 
这样比较冗余,我们可以改进下代码
int main()
{
	char arr[] = "cwzhff@yeah.net";
	const char* sep = "@.";
	char arr2[30] = { 0 };
	strcpy(arr2, arr);
	char* ret=NULL;
  for(ret=strtok(arr,sep);ret!=NULL;ret=strtpk(NULL,sep))
  {
  printf("%s",ret);
  }
  return 0;
}
 
五、strerror
1、函数理解
每个码都有对应的错误信息
2.函数实现
 
总结
1:函数strcat与strncat、strcpy与strncpy、strcmp与strncmp的区别
这俩种尽量用第二种比较安全(也称相对安全函数)
字符函数与字符串函数对于以后的代码实现具有很大的帮助,因此深刻理解字符函数与字符串函数是有必要的!!!





































