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

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

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

在这里插入图片描述

1.知识点

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

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

很多人可能觉得输出结果是<,他们认为结果是-3,所以是<;
但其实结果不然
在这里插入图片描述
原因很简单,就是因为strlen的返回值是无符号整型,无符号数-无符号数结果还是无符号数,无符号数是没有负号的,恒大于0

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

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

2.strlen的模拟

方法一:计数器

#include<stdio.h>

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;
}

在这里插入图片描述

方法二:递归

#include<stdio.h>
#include<assert.h>

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;
}

在这里插入图片描述

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

在这里插入图片描述

1.知识点

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

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

代码1:

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

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

2.strcpy的模拟

#include<stdio.h>
#include<assert.h>

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;
}

在这里插入图片描述

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

在这里插入图片描述

1.知识点

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

2.strcat的模拟

#include<stdio.h>
#include<assert.h>

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;
}

在这里插入图片描述

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

在这里插入图片描述

1.知识点

标准规定:

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

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

2. strcmp的模拟

#include<stdio.h>
#include<assert.h>

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;
}

在这里插入图片描述

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

在这里插入图片描述

1.知识点

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

2.strstr的模拟

#include<stdio.h>
#include<assert.h>

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;
}

在这里插入图片描述

初始图:
在这里插入图片描述
结束图:
在这里插入图片描述

最后:

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

  • 16
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 14
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

PH_modest

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值