C语言学习笔记-进阶(5)字符串函数1

embedded/2025/3/10 5:56:19/

1. strlen的使用 & 模拟实现

size_t strlen ( const char * str );

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

参数指向的字符串必须要以 '\0' 结束。

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

strlen的使用需要包含头文件

学会strlen函数的模拟实现

#include <stdio.h>
#include <string.h>
int main()
{const char* str1 = "abcdef";const char* str2 = "bbb";if(strlen(str2)-strlen(str1)>0){printf("str2>str1\n");} else{printf("srt1>str2\n");}return 0;
}

strlen的模拟实现:

方式1:

//计数器⽅式
int my_strlen(const char * str)
{int count = 0;assert(str);while(*str){count++;str++;}return count;
}

方式2:

//不能创建临时变量计数器
int my_strlen(const char * str)
{assert(str);if(*str == '\0')return 0;elsereturn 1+my_strlen(str+1);
}

方式3:

//指针-指针的⽅式
int my_strlen(char *s)
{assert(str);char *p = s;while(*p != ‘\0’ )p++;return p-s;
}

2. strcpy的使用 & 模拟实现

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

Copies the C string pointed by source into the array pointed by destination, including the

terminating null character (and stopping at that point).

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

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

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

目标空间必须可修改。

学会模拟实现。

strcpy的模拟实现:

//1.参数顺序
//2.函数的功能,停⽌条件
//3.assert
//4.const修饰指针
//5.函数返回值
//6.题⽬出⾃《⾼质量C/C++编程》书籍最后的试题部分
char *my_strcpy(char *dest, const char*src)
{ char *ret = dest;assert(dest != NULL);assert(src != NULL);while((*dest++ = *src++)){;}return ret;
}

3. strcat的使用 & 模拟实现

Appends a copy of the source string to the destination string. The terminating null character

in destination is overwritten by the first character of source, and a null-character is included

at the end of the new string formed by the concatenation of both in destination.

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

目标字符串中也得有 \0 ,否则没办法知道追加从哪里开始。

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

目标空间必须可修改。

字符串自己给自己追加,如何?

模拟实现strcat函数:

char *my_strcat(char *dest, const char*src)
{char *ret = dest;assert(dest != NULL);assert(src != NULL);while(*dest){dest++;}while((*dest++ = *src++)){;}return ret;
}

4. strcmp的使用 & 模拟实现

This function starts comparing the first character of each string. If they are equal to each

other, it continues with the following pairs until the characters differ or until a terminating

null-character is reached.

标准规定:

        ◦ 第⼀个字符串大于第二个字符串,则返回大于0的数字

        ◦ 第⼀个字符串等于第二个字符串,则返回0

        ◦ 第⼀个字符串小于第二个字符串,则返回小于0的数字

        ◦ 那么如何判断两个字符串? 比较两个字符串中对应位置上字符ASCII码值的大小。

strcmp函数的模拟实现:

int my_strcmp (const char * str1, const char * str2)
{int ret = 0 ;assert(src != NULL);assert(dest != NULL);while(*str1 == *str2){if(*str1 == '\0')return 0;str1++;str2++;}return *str1-*str2;
}

http://www.ppmy.cn/embedded/171411.html

相关文章

conda list <package> 指令输出的build和channel含义

Build&#xff1a;表示当前安装包的 构建版本&#xff0c;即该包的编译、构建、发布的具体版本。通常包含一些额外的标识&#xff0c;帮助你区分同一包的不同版本。 Channel&#xff1a; 表示该包的 来源渠道&#xff0c;即该包是从哪个 Anaconda 仓库&#xff08;频道&#…

Unity自定义区域UI滑动事件

自定义区域UI滑动事件 介绍制作1.创建一个Image2.创建脚本 总结 介绍 一提到滑动事件联想到有太多的插件了比如EastTouchBundle&#xff0c;今天想单纯通过UI去做一个滑动事件而不是基于Box2d或者Box去做滑动事件。 制作 1.创建一个Image 2.创建脚本 using UnityEngine; us…

u盘和硬盘的存储结构

一&#xff0c;磁盘设备 (一). 硬盘&#xff08;HDD&#xff09;存储区域构成 硬盘的存储区域主要由扇区、簇、分区和文件系统等组成。 1.扇区&#xff08;Sector&#xff09; 定义&#xff1a;扇区是硬盘存储的最小单位&#xff0c;通常一个扇区的大小为 512字节 或 4KB。作…

从0到1入门RabbitMQ

一、同步调用 优势&#xff1a;时效性强&#xff0c;等待到结果后才返回 缺点&#xff1a; 拓展性差性能下降级联失败问题 二、异步调用 优势&#xff1a; 耦合度低&#xff0c;拓展性强异步调用&#xff0c;无需等待&#xff0c;性能好故障隔离&#xff0c;下游服务故障不影响…

OCP认证报班 vs 自学对比分析

决策关键指标&#xff1a;时间成本、经济成本、通过率、资源获取难度 维度报班系统培训纯自学博睿谷折中方案&#xff08;订阅制学习&#xff09;费用成本1.2万-2.5万&#xff08;含考试费&#xff09;0.8万-1万&#xff08;考试费实验租赁&#xff09;6980元/年&#xff08;全…

一篇文章讲解清楚ARM9芯片启动流程

SAM9X60 ARM9 boot启动流程关键词介绍&#xff1a; 第一级bootloader - 也叫boot ROM&#xff0c;是集成在MPU内部的ROM里面 它的主要功能是执行对MPU的基本初始化和配置&#xff0c;查找并将第二级bootloader从外部NVM中读取出来并放到MPU内部的SRAM. 可以让MPU强制停留在第一…

初识Apache Flink:起源、设计理念与企业级应用全景解析

初识Apache Flink:起源、设计理念与企业级应用全景解析 一、流式处理的演进之路 1.1 从批处理到流式计算的范式转移 在传统数据处理领域,**批处理(Batch Processing)**长期占据主导地位。MapReduce模型的成功证明了大规模离线数据分析的可行性,但存在显著的时间延迟缺陷…

C++二叉搜索树代码

代码一&#xff0c;对应力扣二叉搜索树中的检索&#xff0c;代码见下 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(i…