C语言进阶——字符函数和字符串函数(上)

news/2024/11/25 2:50:29/

目录

一、前言

二、正文 

        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 <stdio.h>
#include <string.h>
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<str1\n");}return 0;
}

                 ②模拟实现

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

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

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

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

        具体代码如下:

        

#include <stdio.h>
#include <assert.h>
//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 <stdio.h>
#include <string.h>
int main()
{char arr1[20] = "";char arr2[] = "Happy new year!";strcpy(arr1, arr2);printf("%s\n", arr1);return 0;
}

                        ②模拟实现

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

        具体代码如下:

        

//strcmp 模拟实现
#include <stdio.h>
#include <string.h>
#include <assert.h>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 <string.h>
#include <stdio.h>int main()
{char arr[20] = "hello ";char* p = "my friend";strcat(arr, p);printf("%s\n", arr);return 0;
}

                        ②strcat模拟实现

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

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

//模拟实现strcat
#include <stdio.h>
#include <string.h>
#include <assert.h>
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 <stdio.h>
#include <string.h>
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 <string.h>
#include <stdio.h>
#include <assert.h>
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;
}

   三、结语

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


http://www.ppmy.cn/news/21567.html

相关文章

蓝桥杯STM32G431RBT6学习——M24C02

蓝桥杯STM32G431RBT6学习——M24C02 前言 IIC是单片机的通用协议&#xff0c;在蓝桥杯单片机、嵌入式中都是考点。国信长天开发板板载M24C02&#xff08;IIC驱动&#xff09;作为调电存储模块&#xff0c;可以通过IIC对其写入数据后&#xff0c;掉电进行保存以供读取。其硬件…

想成为数据分析师,看这里,数据分析必备的43个Excel函数

目录 前言 函数分类&#xff1a; 关联匹配类清洗处理类逻辑运算类计算统计类时间序列类 前言 Excel是我们工作中经常使用的一种工具&#xff0c;对于数据分析来说&#xff0c;这也是处理数据最基础的工具。 很多传统行业的数据分析师甚至只要掌握Excel和SQL即可。 对于初学者…

Android中级——滑动分析

SrcollAndroid坐标系视图坐标系常见方法实现滑动layout()offsetLeftAndRight()和offsetTopAndBottom()LayoutParamsscrollTo()与scrollBy()ScrollerVierDragHeplerAndroid坐标系 将屏幕左上角的顶点作为Android坐标系的原点&#xff0c;向右为X轴正方向&#xff0c;向下为Y轴正…

嵌入式开发:为什么物联网正在吞噬嵌入式操作系统?

在过去几年的嵌入式开发中&#xff0c;独立嵌入式软件市场的两大基石已被物联网公司完全吞噬。第一个FreeRTOS被亚马逊吞并&#xff0c;以支持其亚马逊Web服务(AWS)云平台的物联网开发&#xff0c;Express Logic被微软吞并&#xff0c;用于其竞争对手Azure云服务。许多分析师对…

Spring Boot 无侵入式 实现API接口统一JSON格式返回

无侵入式 统一返回JSON格式 其实本没有没打算写这篇博客的&#xff0c;但还是要写一下写这篇博客的起因是因为&#xff0c;现在呆着的这家公司居然没有统一的API返回格式?&#xff0c;询问主管他居然告诉我用HTTP状态码就够用了&#xff08;fxxk&#xff09;&#xff0c;天哪…

C++ 浅谈之智能指针 shared_ptr 循环引用

C 浅谈之智能指针 shared_ptr 循环引用 HELLO&#xff0c;各位博友好&#xff0c;我是阿呆 &#x1f648;&#x1f648;&#x1f648; 这里是 C 浅谈系列&#xff0c;收录在专栏 C 语言中 &#x1f61c;&#x1f61c;&#x1f61c; 本系列阿呆将记录一些 C 语言重要的语法特…

优化算法:曲径步长通优处,优化半天白优化

本文来自公众号“AI大道理” 训练一个神经网络&#xff0c;我们想要得到误差最小&#xff0c;就是要我们的损失函数最小。 如何得到最小值呢&#xff1f; 这就是优化算法。 梯度下降法是众多优化中的一种。 1、损失函数 2、GD&#xff08;梯度下降法&#xff09; 3、BGD&a…

python输出不重复的字符

项目场景&#xff1a; 输入一个字符串&#xff0c;把最左边的10个不重复的字符&#xff08;大小写算不同字符&#xff09;挑选出来。 如不重复的字符不到10个&#xff0c;则按实际数目输出。问题描述 输出一个字符串&#xff0c;包含字符串s最左边10个不重复的字符。不到10个…