C语言进阶——字符函数和字符串函数(上)
创始人
2024-05-22 21:31:06
0

目录

一、前言

二、正文 

        1.求字符串长度

                ♥strlen

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

                ♥strcpy

                ♥strcat

                ♥strcmp

   三、结语


一、前言

        一日不见,如隔三秋;几日不见,甚是想念。猜想小伙伴们在平常进行有关字符的练习时遇到有关字符的操作却无从下手,不知道该使用哪些函数来实现相应操作,虽然有些厉害的小伙伴还会写出自定义函数来实现想要的功能。为了提高小伙伴们的功底,麦麦就为大家带来库函数中常见的字符函数和字符串函数,有些函数还会进行模拟实现,供小伙伴们食用。话不多说,让我们进入正文吧!                 ​​​​​

二、正文 

        1.求字符串长度

                ♥strlen

                        ①函数介绍

size_t strlen(const char * str);

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

●参数指向的字符串必须要以’\0‘结束

●注意函数的返回值为size_t,是无符号的(易错)

●所引用的头文件“string.h”

//示例代码,帮助大家理解strlen函数的使用
#include 
#include 
int main()
{const char*str1="my friends";const char*str2="welcome to my blog";if(strlen(str2)-strlen(str1)>0){printf("str2>str1\n");}else if(strlen(str2)-strlen(str1)==0){printf("str2=str1\n");}else{printf("str2

                 ②模拟实现

        在介绍完strlen函数的使用和功能后,接下来让我们来模拟实现strlen。下面为小伙伴们带来三种strlen函数的模拟实现。

        ①循环实现:strlen函数是计算到'\0'为止,于是我们就可以采取循环的方式,指针每移动一次,我们就让计数+1,知道指针指向’\0‘为止

        ②递归实现:我们发现循环实现的每一步都是一样的,那么是否可以采取递归的形式呢,答案是可以的。求"hello"的长度,就要求“ello”的长度;要求“ello”的长度,就要求“llo”的长度,这样就形成了一种递归的形式。

        ③指针实现:在指针那一节中我们学到了指针-指针求出的是两个指针间隔的大小。那么我们就可以用字符串末尾的'\0'的地址减去字符串首元素的地址就可以求出字符串的长度了。

        具体代码如下:

        

#include 
#include 
//strlen三种模拟实现,以下代码仅供参考size_t my_strlen_1(const char* str)
{assert(str != NULL);size_t i = 0;while (*str++){i++;}return i;
}size_t my_strlen_2(const char* str)
{assert(str != NULL);if (*str == '\0')return 0;elsereturn(1 + my_strlen_2(str + 1));
}
size_t my_strlen_3(const char* str)
{assert(str != NULL);char* tmp = str;while (*str){str++;}return(str - tmp);
}int main()
{const char* str = "hello";printf("%u\n", my_strlen_1(str)); //循环实现printf("%u\n", my_strlen_2(str)); //递归实现printf("%u\n", my_strlen_3(str)); //指针实现return 0;
}

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

                ♥strcpy

                        ①函数介绍

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

 ●功能:将源(source)字符串拷贝到目标空间中

●源字符串必须以'\0'结束

●会将源字符串中的'\0'拷贝到目标空间

●目标空间必须足够大,以确保能存放源字符串

●目标空间必须可变

●所引用的头文件:string.h

//strcmp使用示例
#include 
#include 
int main()
{char arr1[20] = "";char arr2[] = "Happy new year!";strcpy(arr1, arr2);printf("%s\n", arr1);return 0;
}

                        ②模拟实现

        同样的,在小伙伴们了解完strcmp的功能和基本使用后,我们来进行strcmp的模拟实现。这个实现的逻辑是很清晰的,只需要将源字符串搬运到目标空间即可,因此我们可以采用指针以及循环的方式来实现这个功能,

        具体代码如下:

        

//strcmp 模拟实现
#include 
#include 
#include void my_strcpy(char* dest, const char* sorc)
{assert(dest && sorc);while (*dest++ = *sorc++){;}}int main()
{char arr1[20] = "";char arr2[] = "Happy new year!";my_strcpy(arr1, arr2);printf("%s\n", arr1);return 0;
}

                ♥strcat

                        ①函数介绍

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

●功能:在目标空间后面追加源字符串

●源字符串必须以'\0'结尾

●目标空间必须足够大,能够容纳下源字符串的内容

●字符串不可以给自己追加

●引用的头文件:string.h

//strcat代码示例
#include 
#include int main()
{char arr[20] = "hello ";char* p = "my friend";strcat(arr, p);printf("%s\n", arr);return 0;
}

                        ②strcat模拟实现

        strcat模拟实现的思路:⑴找到目标指针的'/0'【指针加循环】

                                              ⑵将源字符串追加到目标指针的后面【可采用拷贝字符串的方法】

//模拟实现strcat
#include 
#include 
#include 
char* my_strcat(char* dest, const char* sorc)
{assert(dest && sorc);char* ret = dest;while (*dest){dest++;}while (*dest++ = *sorc++){;}return ret;
}int main()
{char arr[20] = "hello ";char* p = "my friend";my_strcat(arr, p);printf("%s\n", arr);return 0;
}

                ♥strcmp

                        ①函数介绍:

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

● 功能:比较两个字符串的大小,从第一个字符开始,直到比出大小【ASCALL值】

                eg:"abc"小于"bcd"——a的值小于b

●标准规定:

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

        ○第一个字符串等于第二个字符串,则返回0

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

//strcmp使用示例
//注:VS环境下,strcmp的返回值为:1、0、-1
#include 
#include 
int main()
{char arr1[] = "abq";char arr2[] = "abcdef";int ret1 = strcmp(arr1, arr2);int ret3 = strcmp(arr2, arr1);int ret2 = strcmp(arr1, arr1);printf("%d\n", ret1);printf("%d\n", ret2);printf("%d\n", ret3);return 0;
}

                         ②模拟实现

        模拟实现strcmp思路:⑴两个字符串一一比较【指针+循环】

                                            ⑵循环若跳出则依据指针内容判断字符串大小

//strcmp 模拟实现
#include 
#include 
#include 
int my_strcmp(const char* str1, const char* str2)
{assert(str1 && str2);while (*str1 && *str2){if (*str1 > *str2)return 1;if(*str1 < *str2)return -1;str1++;str2++;}if (*str1 == '\0' && *str2=='\0')return 0;else if(*str2=='\0')return 1;if (*str1 == '\0')return - 1;
}
int main()
{char arr1[] = "abq";char arr2[] = "abcdef";int ret1 = my_strcmp(arr1, arr2);int ret3 = my_strcmp(arr2, arr1);int ret2 = my_strcmp(arr1, arr1);printf("%d\n", ret1);printf("%d\n", ret2);printf("%d\n", ret3);return 0;
}

   三、结语

        干货满满,有码有图,写文不易,看完的小伙伴们不要忘记动动手指点点赞,走个关注,三连互访!!!

相关内容

热门资讯

【NI Multisim 14...   目录 序言 一、工具栏 🍊1.“标准”工具栏 🍊 2.视图工具...
银河麒麟V10SP1高级服务器... 银河麒麟高级服务器操作系统简介: 银河麒麟高级服务器操作系统V10是针对企业级关键业务...
不能访问光猫的的管理页面 光猫是现代家庭宽带网络的重要组成部分,它可以提供高速稳定的网络连接。但是,有时候我们会遇到不能访问光...
AWSECS:访问外部网络时出... 如果您在AWS ECS中部署了应用程序,并且该应用程序需要访问外部网络,但是无法正常访问,可能是因为...
Android|无法访问或保存... 这个问题可能是由于权限设置不正确导致的。您需要在应用程序清单文件中添加以下代码来请求适当的权限:此外...
北信源内网安全管理卸载 北信源内网安全管理是一款网络安全管理软件,主要用于保护内网安全。在日常使用过程中,卸载该软件是一种常...
AWSElasticBeans... 在Dockerfile中手动配置nginx反向代理。例如,在Dockerfile中添加以下代码:FR...
AsusVivobook无法开... 首先,我们可以尝试重置BIOS(Basic Input/Output System)来解决这个问题。...
ASM贪吃蛇游戏-解决错误的问... 要解决ASM贪吃蛇游戏中的错误问题,你可以按照以下步骤进行:首先,确定错误的具体表现和问题所在。在贪...
月入8000+的steam搬砖... 大家好,我是阿阳 今天要给大家介绍的是 steam 游戏搬砖项目,目前...