c语言字符串函数(strlen strcpy strcat strcmp等使用及模拟)

在编程的过程中,我们经常要处理字符和字符串,为了方便操作字符和字符串,C语⾔标准库中提供了一系列库函数,接下来我们就学习一下这些函数。

目录

1、strlen的使用及模拟实现。

2、strcpy的使用及模拟实现。

3、strcat的使用及模拟实现。

4、strcmp的使用及模拟实现。

5、strncpy的使用及模拟实现。

6、strncat的使用及模拟实现。

7、strncmp的使用及模拟实现。


strlen strcpy strcat strcmp strncpy strncat strncmp函数的头文件为<string.h>

1、strlen的使用及模拟实现。

size_t  strlen ( char * str )

字符串以 '\0' 作为结束标志,strlen函数返回的是在字符串中 '\0' 前⾯出现的字符个数(不包
含 '\0' )。

• 参数指向的字符串必须要以 '\0' 结束。
• 注意函数的返回值为size_t,是无符号的( 易错 )
• strlen的使⽤需要包含头文件
1、1  strlen函数的使用如下。  

#include<stdio.h>
 #include<stdio.h>
int main()
{
	char arr[] = "hello world";
	printf("%d", strlen(arr));
}

 1、2  strlen函数的模拟实现

#include<stdio.h>
int my_strlen(char* p)
{
	int count=0;
	while (*p++ != '\0')
		count++;
	return count;
}
int main()
{
	char arr[] = "hello world";
	printf("%d", my_strlen(arr));
}

2、strcpy的使用及模拟实现。

char* strcpy(char * destination, const char * source )

将源指向的C字符串复制到目标指向的数组中,包括终止空字符(并在该点停止)
• 将源字符串中的 '\0' 拷⻉到目标空间。
• 目标空间必须足够大,以确保能存放源字符串

2、1 strcpy的使用

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
int main()
{
	char str1[20] = "abcd";
	char str2[] = "hello world";
	strcpy(str1,str2 );
	printf("%s", str1);
	return 0;
}

2、2 strcpy 的模拟。

#include<stdio.h>
char* my_strcpy(char* str1, char* str2)
{
	char* p = str1;//str1的地址进入循环会改变,所以将str1原本的地址记录起来
	while (*str2 != '\0')//str2指向'\0'跳出循环
	{
		*str1++ = *str2++;//将str2一一赋值给str1
	}
	return p;//返回str1的地址
}
int main()
{
	char str1[20] = "abcd";
	char str2[] = "hello world";
	printf("%s", my_strcpy(str1, str2));
	return 0;
}

3、strcat的使用及模拟实现。

char* strcat( char* destination,char* source )

• 将源字符串的追加到目标字符串中。destinnation的终止字符被source第一个字符覆盖。
•源字符串必须以 '\0' 结束。
•会将源字符串中的 '\0' 拷贝到⽬标空间。
•目标空间必须足够⼤,以确保能存放源字符串。

3、1 strcat的使用

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
int main()
{
	char str1[20] = "hello";
	char str2[] = "world";
	printf("%s", strcat(str1, str2));
	return 0;
}

3、2 strcat的模拟

#include<stdio.h>
char* my_strcat(char* str1, char* str2)
{
	char* ret = str1;//同上述函数,记录此时str1的地址
	while (*str1 != '\0')//找到str1的终止字符并跳出循环
		str1++;
	while (*str2 != '\0')
		*str1++ = *str2++;
	return ret; //输出str1;
}
int main()
{
	char str1[20] = "hello";//给定字符数组大小
	char str2[] = "world";
	printf("%s", my_strcat(str1,str2));
}

4、strcmp的使用及模拟实现。

int strcmp ( char* str1, char* str2)

•将相对应位置字符的ascii值一一比较
•第⼀个字符串⼤于第二个字符串,则返回大于0的数字。
•第⼀个字符串等于第二个字符串,则返回0。
•第⼀个字符串小于第二个字符串,则返回小于0的数字。

4、1 strcmp的使用

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
int main()
{
	char str1[] = "abcd";
	char str2[] = "abce";
	printf("%d",strcmp(str1, str2));//strcmp库函数只会输出数字结果,并不会直接输出大小信息
	//若数字为正数,则str1大于str2
	//若数字为0,则str1等于str2
	//若数字为负数,则str1小于str2
}

4、2 strcmp的模拟

#include<stdio.h>
#include<assert.h>
int my_strcmp(char* str1, char* str2)
{
	assert(str1 && str2);//若str1或者str2为空,会弹出警告,增加安全性
	while (*str1 == *str2)
	{
		if (*str1 == '\0')//这里说明str1和str2完全相等
			return 0;
		str1++;
		str2++;
	}
	return *str1 - *str2;//利用两者ASCII的差值直接得出大小
}
int main()
{
	char str1[] = "abcd";
	char str2[] = "abc";
	printf("%d ",my_strcmp(str1, str2));
}

 strncpy strncat strncmp函数与上述函数只有一字之差,作用也大体相似。

n代表了选择性的进行函数操作。

那么下面来学习它们的不同之处吧。

5、strncpy的使用及模拟实现。

char* strncpy (char* destinnation , char* source,size_t num )

拷贝num个字符从源字符串到⽬标空间
•如果源字符串的长度小于num,则拷贝完源字符串之后,在目标的后边追加0,直到num个(我看了很多小编的strncpy函数是没有补加0的,需要注意)

5、1 strncpy的使用

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
int main()
{
	char str1[20] = "abcd";
	char str2[] = "hello world";
	strncpy(str1, str2, 20);
	printf("%s", str1);
	return 0;
}

5、2  strncpy的模拟

#include<stdio.h>
char* my_strncpy(char* str1, char* str2,size_t n)
{
	char* p = str1;//str1的地址进入循环会改变,所以将str1原本的地址记录起来
	int i = n;//记录n原本的值
	while(n--&&*str2!='\0')
	{
		*str1++ = *str2++;//将str2一一赋值给str1
	}
	if(i>strlen(str2))//需要复制的字符数大于str2字符长度时,用0补充
		while (n--)
		{
			*str1++ = '0';
		}
	*str1 = '\0';
	return p;//返回str1的地址
}
int main()
{
	char str1[20] = "abcd";
	char str2[] = "hello world";
	my_strncpy(str1, str2,20);
	printf("%s", str1);
	return 0;
}

6、strncat的使用及模拟实现。

char* strncat (char* destinnation , char* source,size_t num )

.将source的n个字节复制到destination后 

6、1 strncat的使用

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
int main()
{
	char str1[20] = "hello";
	char str2[] = "world";
	printf("%s", strncat(str1, str2,3));
	return 0;
}

6、2 strncat的模拟

#include<stdio.h>
char* my_strcat(char* str1, char* str2,size_t n)
{
	char* ret = str1;//同上述函数,记录此时str1的地址
	while (*str1 != '\0')//找到str1的终止字符并跳出循环
		str1++;
	while (*str2 != '\0'&&n--)
		*str1++ = *str2++;
	return ret; //输出str1;
}
int main()
{
	char str1[20] = "hello";//给定字符数组大小
	char str2[] = "world";
	printf("%s", my_strcat(str1,str2,3));
}

7、strncmp的使用及模拟实现。

int  strncat (char* destinnation , char* source,size_t num )

 比较str1和str2的前num个字符,如果相等就继续往后比较,最多比较num个字⺟,如果提前发现不一样,就提前结束,大的字符所在的字符串⼤于另外一个。如果num个字符都相等,就是相等返回0

7、1 strncmp的使用

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
int main()
{
	char str1[] = "abcde";
	char str2[] = "abce";
	printf("%d",strncmp(str1, str2, 4));//strcmp库函数只会输出数字结果,并不会直接输出大小信息
	//若数字为正数,则str1大于str2
	//若数字为0,则str1等于str2
	//若数字为负数,则str1小于str2
}

7、2 strncmp的模拟

#include<stdio.h>
#include<assert.h>
int my_strncmp(char* str1, char* str2,size_t n)
{
	assert(str1 && str2);//若str1或者str2为空,会弹出警告,增加安全性
	while (*str1 == *str2&&--n)//注意这里为--n;
	{
		if (*str1 == '\0')//这里说明str1和str2完全相等
			return 0;
		++str1;
		++str2;
	}
	return *str1 - *str2;//利用两者ASCII的差值直接得出大小
}
int main()
{
	char str1[] = "abcd";
	char str2[] = "abc";
	printf("%d ",my_strncmp(str1, str2,4));
}

看到这里,喜欢作品就留下小红心再走吧 ,能得到你们的支持是我创作的不竭动力。

我会力所能及地与你们分享知识,关注我,下篇学习初步数据结构哦

  • 63
    点赞
  • 46
    收藏
    觉得还不错? 一键收藏
  • 16
    评论
1. 智慧社区背景与挑战 随着城市化的快速发展,社区面临健康、安全、邻里关系和服务质量等多方面的挑战。华为技术有限公司提出智慧社区解决方案,旨在通过先进的数字化技术应对这些问题,提升城市社区的生活质量。 2. 技术推动智慧社区发展 技术进步,特别是数字化、无线化、移动化和物联化,为城市社区的智慧化提供了可能。这些技术的应用不仅提高了社区的运行效率,也增强了居民的便利性和安全性。 3. 智慧社区的核心价值 智慧社区承载了智慧城市的核心价值,通过全面信息化处理,实现对城市各个方面的数字网络化管理、服务与决策功能,从而提升社会服务效率,整合社会服务资源。 4. 多层次、全方位的智慧社区服务 智慧社区通过构建和谐、温情、平安和健康四大社区模块,满足社区居民的多层次需求。这些服务模块包括社区医疗、安全监控、情感沟通和健康监测等。 5. 智慧社区技术框架 智慧社区技术框架强调统一平台的建设,设立数据中心,构建基础网络,并通过分层建设,实现平台能力及应用的可持续成长和扩展。 6. 感知统一平台与服务方案 感知统一平台是智慧社区的关键组成部分,通过统一的RFID身份识别和信息管理,实现社区服务的智能化和便捷化。同时,提供社区内外监控、紧急救助服务和便民服务等。 7. 健康社区的构建 健康社区模块专注于为居民提供健康管理服务,通过整合医疗资源和居民接入,实现远程医疗、慢性病管理和紧急救助等功能,推动医疗模式从治疗向预防转变。 8. 平安社区的安全保障 平安社区通过闭路电视监控、防盗报警和紧急求助等技术,保障社区居民的人身和财产安全,实现社区环境的实时监控和智能分析。 9. 温情社区的情感沟通 温情社区着重于建立社区居民间的情感联系,通过组织社区活动、一键呼叫服务和互帮互助平台,增强邻里间的交流和互助。 10. 和谐社区的资源整合 和谐社区作为社会资源的整合协调者,通过统一接入和身份识别,实现社区信息和服务的便捷获取,提升居民生活质量,促进社区和谐。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值