首页 > 其他分享 >C语言 之 strlen、strcpy、strcat、strcmp字符串函数的使用和模拟实现

C语言 之 strlen、strcpy、strcat、strcmp字符串函数的使用和模拟实现

时间:2024-08-18 14:56:46浏览次数:7  
标签:const int str1 strcat C语言 char strcpy 字符串 strlen

文章目录


本章的内容主要讲解这4个与字符串相关的函数的原型、使用以及模拟实现

strlen的使用和模拟实现

函数的原型

size_t strlen ( const char * str );

1.字符串以 ‘\0’ 作为结束标志,strlen函数返回的是在字符串中 ‘\0’ 前⾯出现的字符个数(不包含 ‘\0’ )。
2.参数指向的字符串必须要以 ‘\0’ 结束。
3.注意函数的返回值为size_t,所以结果不能为负数。
4.strlen的使⽤需要包含头⽂件string.h

strlen模拟实现:

方法1

//计数器方式
int my_strlen(const char* str)
{
	int count = 0;
	while (*str)
	{
		count++;
		str++;
	}
	return count;
}
int main()
{
	const char* str1 = "fallzzzzz";
	int tmp = my_strlen(str1);
	printf("lenth = %d\n", tmp);
	return 0;
}

方法2

//不能创建临时变量计数器
//使用递归的方式
int my_strlen(const char* str)
{
	if (*str == '\0')
		return 0;
	else
		return 1 + my_strlen(str + 1);
}
int main()
{
	const char* str1 = "fallzzzzz";
	int tmp = my_strlen(str1);
	printf("lenth = %d\n", tmp);
	return 0;
}

方法3

//指针-指针的⽅式 
//指针-指针的结果是两指针之间的元素个数
int my_strlen(char* str)
{
	char* p = str;
	while (*p != '\0')
	{
		p++;
	}
	return p - str;
}
int main()
{
	const char* str1 = "fallzzzzz";
	int tmp = my_strlen(str1);
	printf("lenth = %d\n", tmp);
	return 0;
}

strcpy的使用和模拟实现

函数的原型

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

我们把source称作源字符串
我们把destination称作目标字符串
该函数为拷贝函数,可以把源字符串拷贝到目标字符串

1.源字符串必须以 ‘\0’ 结束。
2.该拷贝会将源字符串中的 ‘\0’ 拷贝到目标空间。
3.⽬标空间必须足够大,以确保能存放源字符串。
4.⽬标空间必须是可修改的,即不为const。

strcpy的模拟实现:

char* my_strcpy(char* dest, const char* src)
{
	//用临时变量保存 因为之后dest和src的指针指向有变 无法直接返回指向首元素的指针
	char* ret = dest;
	assert(dest != NULL);
	assert(src != NULL);

	while ((*dest++ = *src++))
	{
		//在while的循环条件中就完成了拷贝
		//所以这里用空语句即可
		;
	}
	return ret;
}

int main()
{
	char str1[] = "fallzzzzz";
	char str2[20];
	char* tmp = my_strcpy(str2, str1);
	printf("str2 = %s\n", tmp);
	return 0;
}

strcat的使用和模拟实现

函数的原型

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

1.源字符串必须以 ‘\0’ 结束。
2.目标字符串中也得有 ‘\0’ ,否则没办法知道追加从哪里开始。
3.⽬标空间必须有⾜够的⼤,能容纳下源字符串的内容。
4.⽬标空间必须可修改,即目标字符串不为const类型。

该函数为追加字符串函数,能够在一个字符串之后追加上另一个字符串

strcat的模拟实现:

char* my_strcat(char* dest, const char* src)
{
	char* ret = dest;
	assert(dest != NULL);
	assert(src != NULL);
	while (*dest)  //遇到'\0'停止
	{
		dest++;
	}
	while ((*dest++ = *src++))
	{
		;
	}
	return ret;
}
int main()
{
	char str1[] = "hello ";
	char str2[] = "the ";
	char str3[] = "fallzzzzz ";
	char str4[50];
	strcpy(str4, str1); //先将str1拷贝到str4,目的是让目标字符串中有'\0'
	my_strcat(str4, str2);
	my_strcat(str4, str3);
	puts(str4);  //将字符串(以‘\0’结束的字符序列)输出
	return 0;
}

strcmp的使用和模拟实现

函数的原型

int strcmp ( const char * str1, const char * str2 );

该函数为字符串的大小比较函数,比较的是两个字符串中对应位置上的字符的ASCII码值的大小。
第⼀个字符串大于第⼆个字符串,则返回大于0的数字
第⼀个字符串等于第⼆个字符串,则返回0
第⼀个字符串小于第⼆个字符串,则返回小于0的数字

strcmp的模拟实现

int my_strcmp(const char* str1, const char* str2)
{
	int ret = 0;
	assert(str1 != NULL);
	assert(str2 != NULL);
	while (*str1 == *str2)
	{
		if (*str1 == '\0') 
		{
			//在*str1 == *str2的条件下,其中一个为'\0',那么另一个也为'\0'
			//两个都访问到'\0',那么就说明这两个字符串是相等的,所以跳出循环 返回0
			return 0;
		}	
		str1++;
		str2++;
	}
	return *str1 - *str2;  //将ASCII码值相减的结果作为返回值 就能通过该字符ASCII码值的大小关系比较出字符串的大小关系
}
int main()
{
	char* str1 = "hello";
	char* str2 = "fallzzzzz";
	int tmp = my_strcmp(str1, str2);
	printf("%d", tmp);
	return 0;
}

标签:const,int,str1,strcat,C语言,char,strcpy,字符串,strlen
From: https://blog.csdn.net/fallzzzzz/article/details/141286229

相关文章

  • C语言工程实践实现完整的五子棋项目一
    五子棋第一章玩家信息部分五子棋五子棋第一章前言一、所需技术二、玩家信息部分实现1.头文件部分2.菜单部分3.玩家信息部分总结每文推荐前言接下来的几篇文章我将带领大家实现一个工程实践的项目–五子棋。它是一个比较完整的项目,主要包括了三个部分:1.玩家信......
  • 【C语言篇】数组和函数的实践:扫雷游戏(附源码)
    文章目录前言扫雷游戏的分析和设计扫雷游戏的功能说明游戏的分析和设计文件结构设计扫雷游戏的代码实现初始化棋盘打印棋盘布置雷排查雷扫雷游戏的拓展前言源码在最后扫雷游戏的分析和设计经典扫雷游戏扫雷游戏的功能说明使⽤控制台实现经典的扫雷游戏游戏可......
  • 【C语言】内存函数
    memcpy使用和模拟实现void*memcpy(void*destination,constvoid*source,size_tnum);介绍:•函数memcpy从source的位置开始向后复制num个字节的数据到destination指向的内存位置。•这个函数在遇到‘\0’的时候并不会停下来。•如果source和destinati......
  • C语言学习————常量和宏、初识指针
    #define定义常量和宏define是一个预处理指令用途:1.define定义符号#defineMAX1000intmain(){ printf("%d\n",MAX); return0;}2.define定义宏#defineADD(X,Y)((X)+(Y))intmain(){ printf("%d\n",ADD(2,3)); return0;}指针内存内存是计算机上特......
  • C语言 错误 C4716 “printstar”: 必须返回一个值
    错误:解决办法: 此类代码显然不需要返回值1.点击“项目”——“属性”2.点击“C/C++”中的“高级”——“禁用特定警告”中输入“4716”——点击“确定” 3.重新运行即可成功 ......
  • c语言(8.18)
    补一下前几天练习的代码#include<stdio.h>intmain(){ intn=0; //scanf("%d",&n); intsum=0; for(intj=1;j<=10;j++) { intmul=1;//mul应该放在里面才行,每一次新的阶乘mul都是1 for(inti=1;i<=j;i++) { mul=mul*i; }......
  • 【时时三省】(C语言基础)调试技巧2
    山不在高,有仙则名。水不在深,有龙则灵。             ----CSDN时时三省多多动手,尝试调试,才能有进步。•一定要熟练掌握调试技巧。•初学者可能80%的时间在写代码,20%的时间在调试。但是一个程序员可能20%的时间在写程序,但是80%的时间在调试。•我......
  • 【C语言初阶】掌握C语言调试技巧,迈向高效编程的阶梯
    ......
  • 油管视频《编程思维》中的题目,使用C语言编写出来,第十集,世界上的机器
    题目:假设首先我拥有大量的机器人,从迷宫中心的水晶出发,其次我拥有取之不尽的线轴,这些线非常结实耐用,可以在必要时刻切断线,现在面对一个迷宫,迷宫以水晶为中心,哪里有许多条死胡同,但没有一条会绕回到起点,我只有一次机会,可以在机器人们跳入迷宫,寻找出口前,发送一条简单的指令,请问什么......
  • C语言程序设计-[22] 数组应用
    1、简单插入排序算法根据以上分析,代码与结果如下:#include"stdio.h"intmain(){ intcount,j,x,a[101];scanf("%d",&x);if(x<=0) return;else a[1]=x;count=1;scanf("%d",&x);while(x>0){ ......