当前位置:首页 » 《随便一记》 » 正文

字符串库函数及模拟实现【上篇】--- strlen + strcpy + strcat + strcmp_呀小边同学的博客

10 人参与  2021年11月28日 08:45  分类 : 《随便一记》  评论

点击全文阅读


本文重点

  • 1.strlen
  • 2.strcpy
  • 3.strcat
  • 4.strcmp

💜在本专题内 将重点介绍:

⭐️字符函数
⭐️字符串函数
⭐️内存函数
这些库函数的使用和注意事项。

这些注意事项有些看似是很不起眼,但是我们必须充分了解以便自己能模拟实现。
所以在看注意事项时,一是要在未来使用时多注意,二是要思考对应需求如何用代码实现。

有:
🍎求字符串长度的函数

1.strlen

🍎长度不受限制的字符串函数

1.strcpy
2.strcat
3.strcmp

🍎长度受限制的的字符串函数

1.strncpy
2.strncat
3.strncmp

引:

C语言中对字符和字符串的处理很是频繁,但是C语言本身没有字符串类型,字符串通常放在常量字符串字符数组中。

正文开始@边通书

学习这块内容,要勤查阅此网站:
点击直达http://www.cplusplus.com/

1.strlen

在这里插入图片描述
下面将围绕这几点详细展开:

🍇strlen函数用来计算字符串长度,返回的是\0之前出现字符个数
🍇参数指向字符串必须以\0结束
🍇函数的返回值类型为size_t,即无符号整型(易错)
😇学会strlen的模拟实现(三种方法:1.计数器 2.指针-指针 3.递归 — 不创建任何临时变量实现求字符串长度

🍇strlen函数返回的是无符号整型:
在这里插入图片描述
典例:
问输出结果?

#include <stdio.h>
#include <sting.h>

int main()
{
	const char*str1 = "abcdef";
	const char*str2 = "bbb";
	if (strlen(str2) - strlen(str1)>0)
	{
		printf("hehe\n");
	}
	else
	{
		printf("haha\n");
	}
	return 0;
}

在这里插入图片描述
🍇参数指向字符串必须以\0结束
在这里插入图片描述

😇strlen的模拟实现my_strlen(三种方式)

🐟 计数器
在这里插入图片描述
🐟 指针 - 指针
在这里插入图片描述
🐟 递归(不创建临时变量)
在这里插入图片描述
代码如下:

#include <stdio.h>

size_t my_strlen(char* ptr)
{
	if ((*ptr) != '\0')
	{
		return 1 + my_strlen(ptr+1);
	}
	else
	{
		return 0;
	}
}

int main()
{
	char arr[] = "beatles";
	size_t len = my_strlen(arr);
	printf("%u\n", len);
	return 0;
}

画图分析递归调用过程:
在这里插入图片描述

2.strcpy

在这里插入图片描述

🍇源字符串必须以\0结束
🍇会将源字符串的\0拷贝到目标空间
🍇目标空间必须足够的大,能容下源字符串内容
🍇目标空间可修改
😇学会strlen的模拟实现

🍇源字符串必须以\0结束
在这里插入图片描述

🍇会将源字符串的\0拷贝到目标空间
在这里插入图片描述
🍇目标空间必须足够大
在这里插入图片描述
🍇目标空间可修改
在这里插入图片描述

😇strcpy函数的模拟实现

完美代码:

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

char* my_strcpy(char* dest, const char* src)
{
	assert(dest&&src);//断言-release版本可以优化掉
	char* ret = dest;
	//1.拷贝字符串
	//2.遇到\0为止
	while (*dest++ = *src++ )
	{
		;
	}
	return ret;
}
int main()
{
	char arr1[20] = "abc";
	char arr2[] = "def";
	printf("%s\n", my_strcpy(arr1, arr2));
	return 0;
}

剖析:
在这里插入图片描述

3.strcat

字符串连接/追加。
在这里插入图片描述
在这里插入图片描述

🍇源字符串必须以\0结束
🍇目标空间足够大,能容纳下源字符串内容
🍇目标空间可修改
🍇自己给自己追加要用strncat
😇strcat的模拟实现

🍇源字符串必须以\0结束
在这里插入图片描述

🍇目标空间足够大,能容纳下源字符串内容
在这里插入图片描述

😇strcat的模拟实现—my_strcat

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

char* strcat(char* dest, const char* src)
{
	assert(dest&&src);//断言
	char* ret = dest;
	//1.找到目标字符串末尾'\0'
	while (*dest != '\0')
	{
		dest++;
	}
	//2.追加字符串直到'\0'-与strcpy非常相似
	while (*dest++ = *src++)
	{
		;
	}
	return ret;
}
int main()
{
	char arr1[20] = "abc";
	char arr2[] = "def";
	printf("%s\n", strcat(arr1, arr2));
	return 0;
}

4.strcmp

在这里插入图片描述
在这里插入图片描述
😇strcmp的模拟实现my_strcmp

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

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

int main()
{
	char arr1[] = "abcd";
	char arr2[] = "abc";
	int ret = my_strcmp(arr1, arr2);
	printf("%d\n", ret);
	if (ret == 0)
	{
		printf("==\n");
	}
	else if (ret > 0)
	{
		printf(">\n");
	}
	else
	{
		printf("<\n");
	}
}

在这里插入图片描述
剖析:
在这里插入图片描述
那么,以上strcpy,strcat,srtcmp是没有长度限制的字符串函数,这些函数是相对不安全的。
下篇文章将介绍相对安全的,有长度限制的字符串函数strcpy,strcat,strcmp

有木有发现小边文章里出现的都是应季水果,小边天天都在吃哈哈哈哈哈

未完待续@边通书


点击全文阅读


本文链接:http://zhangshiyu.com/post/31332.html

字符串  函数  目标  
<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

关于我们 | 我要投稿 | 免责申明

Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1