【C语言跬步积累】——字符串函数(strlen、strcpy、strcat、strcmp、strstr)

博客主页:PH_modest的博客主页
当前专栏:C语言跬步积累
其他专栏:
每日一题
读书笔记
每日反刍
座右铭:广积粮,缓称王!

一.strlen(计算字符串的长度)

【C语言跬步积累】——字符串函数(strlen、strcpy、strcat、strcmp、strstr)_第1张图片

1.知识点

1.strlen函数返回值类型是size_t(无符号整型);
请看下面代码输出的是什么:

#include
#include
int main()
{
	if (strlen("abc") - strlen("abcdef") > 0)
	{
			printf(">\n");
	}
	else
    {
		printf("<=\n");
	}
	return 0;
	}

很多人可能觉得输出结果是<,他们认为结果是-3,所以是<;
但其实结果不然
【C语言跬步积累】——字符串函数(strlen、strcpy、strcat、strcmp、strstr)_第2张图片
原因很简单,就是因为strlen的返回值是无符号整型,无符号数-无符号数结果还是无符号数,无符号数是没有负号的,恒大于0

2.字符串以 ‘\0’ 作为结束标志,strlen函数返回的是在字符串中 ‘\0’ 前面出现的字符个数(不包
含 ‘\0’ )

3.参数指向的字符串必须要以 ‘\0’ 结束,否则返回值将会是一个随机值

2.strlen的模拟

方法一:计数器

#include

int my_strlen(char* arr)
{
	int flag = 0;
	while(*arr != '\0')
	{
		flag++;
		arr++;
	}
	return flag;
}

int main()
{
	char arr[] = "abcde";
	int ret = 0;
	ret = my_strlen(arr);
	printf("%d\n", ret);
	return 0;
}

【C语言跬步积累】——字符串函数(strlen、strcpy、strcat、strcmp、strstr)_第3张图片

方法二:递归

#include
#include

int my_strlen(const char* arr)
{
	assert(arr);//断言,判断一下arr是否是空指针,使代码更加安全
	if (*arr != '\0')
	{
		return 1 + my_strlen(arr + 1);
	}
	else
	{
		return 0;
	}
}

int main()
{
	char arr[] = "abcde";
	int ret = 0;
	ret = my_strlen(arr);
	printf("%d\n", ret);
	return 0;
}

【C语言跬步积累】——字符串函数(strlen、strcpy、strcat、strcmp、strstr)_第4张图片

二.strcpy(将一个字符串内的内容复制到另一个字符串中)

【C语言跬步积累】——字符串函数(strlen、strcpy、strcat、strcmp、strstr)_第5张图片

1.知识点

  • 源字符串必须以’\0’结束;
  • 会将源字符串中的’\0’拷贝到目标空间;
  • 目标空间必须足够大,才能确保能存放源字符串;
  • 目标空间必须可修改;(即不能用const进行修饰

为了方便大家理解,请判断以下代码有何问题?

代码1:

#include
#include
int main()
{
	char* p = "abcdef";
	char arr[10]="ghi";
	strcpy(p,arr);
	printf("%s\n",p);
	return 0;
}

该代码是错误的,p的类型是char*,这是一个指向字符串常量的指针,指向的内容是不可修改的

2.strcpy的模拟

#include
#include

char* my_strcpy(char* arr2, const char* arr1)
{
	char* ret = arr2;//返回的是目标空间的起始地址,所以需要保存起始地址
	assert(arr1 && arr2);
	while(*arr1 != '\0')
	{
		*arr2 = *arr1;
		arr1++;
		arr2++;
	}
	*arr2 = *arr1;
	return ret;//返回起始地址
}

int main()
{
	char arr1[10] = "hehe!";
	char arr2[20] = "0";
	char ret = "0";
	ret = my_strcpy(arr2, arr1);
	printf("%s\n", arr2);
	return 0;
}

【C语言跬步积累】——字符串函数(strlen、strcpy、strcat、strcmp、strstr)_第6张图片

三.strcat(将一个字符串的内容追加到另一个字符串后面)

【C语言跬步积累】——字符串函数(strlen、strcpy、strcat、strcmp、strstr)_第7张图片

1.知识点

  • 源字符串必须以’\0’结束;
  • 目标空间必须有足够大的、能容纳下源字符串的内容;
  • 目标空间必须可修改;
  • 字符串不能给自己追加

2.strcat的模拟

#include
#include

char* my_strcat(char* arr1, const char* arr2)
{
	char* ret = arr1;//将首地址赋给ret,便于最后返回字符串的首地址
	assert(arr1 && arr2);
	char* pc = arr1;
	while (*pc != '\0')//找到目标空间的'\0'
	{
		pc++;
	}
	while (*pc++ = *arr2++)//拷贝
	{
		;
	}
	return ret;
}

int main()
{
	char arr1[20] = "hello ";
	char arr2[10] = "bit!";
	my_strcat(arr1, arr2);
	printf("%s\n",arr1);
	return 0;
}

【C语言跬步积累】——字符串函数(strlen、strcpy、strcat、strcmp、strstr)_第8张图片

四.strcmp(比较两个字符串的大小)

【C语言跬步积累】——字符串函数(strlen、strcpy、strcat、strcmp、strstr)_第9张图片

1.知识点

标准规定:

  • 第一个字符串大于第二个字符串,则返回大于0的数字
  • 第一个字符串等于第二个字符串,则返回0
  • 第一个字符串小于第二个字符串,则返回小于0的数字

注意: strcmp返回值并非是和0,1比较的,但有些编译器可能大于时返回1,小于时返回-1,等于时返回0,这点需要注意一下,在之后判断时最好和0比较,即判断返回值是大于0,还是小于0,还是等于0

2. strcmp的模拟

#include
#include

int my_strcmp(const char* arr1, const char* arr2)
{
	assert(arr1 && arr2);
	while (*arr1 == *arr2)
	{
		if (*arr1 == '\0')
		{
			return 0;
		}
		arr1++;
		arr2++;
	}
	return (*arr1 - *arr2);
}

int main()
{
	char arr1[20] = "abceef";
	char arr2[20] = "abceaf";
	int ret = 0;
	ret = my_strcmp(arr1, arr2);
	printf("%d\n", ret);
	return 0;
}

【C语言跬步积累】——字符串函数(strlen、strcpy、strcat、strcmp、strstr)_第10张图片

五.strstr(寻找一个字符串中是否存在另一个字符串)

【C语言跬步积累】——字符串函数(strlen、strcpy、strcat、strcmp、strstr)_第11张图片

1.知识点

  • 如果能找到,返回找到的字符串的首地址
  • 如果没找到,返回空指针(NULL)

2.strstr的模拟

#include
#include

char* my_strstr(const char* arr1, const char* arr2)
{
	assert(arr1 && arr2);
	char* p1 = (char*)arr1;//用来游历,比较是否相等,不相等会返回
	char* p2 = (char*)arr2;
	char* str = (char*)arr1;//用来标记,便于返回
	while (*str)
	{
		p1 = str;
		p2 = (char*)arr2;
		while (*p1 != '\0' && *p2 != '\0' && *p1 == *p2)
		{
			p1++;
			p2++;
		}
		if (*p2 == '\0')
		{
			return str;
		}
		else
		{
			str++;
		}
	}
	return NULL;
}

int main()
{
	char arr1[20] = "abbcdefg";
	char arr2[20] = "bcd";
	char* ret = NULL;
	ret = my_strstr(arr1, arr2);
	if (ret == NULL)
	{
		printf("找不到\n");
	}
	else
	{
		printf("%s\n", ret);
	}
	return 0;
}

【C语言跬步积累】——字符串函数(strlen、strcpy、strcat、strcmp、strstr)_第12张图片

初始图:
【C语言跬步积累】——字符串函数(strlen、strcpy、strcat、strcmp、strstr)_第13张图片
结束图:
【C语言跬步积累】——字符串函数(strlen、strcpy、strcat、strcmp、strstr)_第14张图片

最后:

本篇博客粗略的介绍了一下部分字符串函数,这些字符串函数都是长度不受限制的,还有部分长度受限制的字符串函数将在本专栏下一篇中讲解,感兴趣的欢迎订阅本专栏。

你可能感兴趣的:(c语言跬步积累,c语言,算法,学习,开发语言)