字符串函数(一)
✨博客主页:小钱编程成长记
🎈博客专栏:进阶C语言
字符串函数(一)
- 0.前言
- 1.求字符串长度的函数
- 1.1 strlen(字符串长度)
- 2.长度不受限制的字符串函数
- 2.1 strcpy(字符串拷贝)
- 1.3 strcat(字符串追加)
- 2.3 strcmp(字符串比较)
- 总结
0.前言
小知识:
- C语言中对字符和字符串的处理很是频繁,但是C语言本身是没有字符串类型的,字符串通常放在常量字符串或者字符数组中。
- 字符串常量适用于那些多它不做修改的字符串函数。
assert
断言,需要头文件assert.h 。是用来判断表达式的值不能为某值的。若表达式为假,会报错,而且会指出错误的位置,提醒你修改。
字符串函数的头文件都是string.h
1.求字符串长度的函数
1.1 strlen(字符串长度)
具体介绍链接
size_t strlen (const char *str);
注:
- 字符串已 ‘\0’ 作为结束标志,strlen函数返回的是在字符串中 ‘\0’ 前面出现的字符个数(不包含 ‘\0’ )。
- 参数指向的字符串必须要以 ‘\0’ 结束,否则返回的结果为随机值。
- 注意函数的返回类型为size_t,是无符号整型( 易错 ),用%zd打印。
- 学会strlen函数的模拟实现
#include <stdio.h>
#include <string.h>int main()
{const char* str1 = "abcdef";const char* str2 = "bbb";if (strlen(str2) - strlen(str1) >= 0)//因为strlen返回类型是size_t(无符号整型),所以差也是无符号整型,无符号整型一定>=0。{printf(">=");}else{printf("<");}return 0;
}
若将返回值强转为整型,差就为-3,打印出<
strlen的模拟实现的三种方法:
- 计数器
#include <stdio.h>
#include <assert.h>size_t my_strlen1(const char* str)//str指向的字符不需要修改,可以加上const保护字符,防止其被修改
{assert(str);//断言(需要头文件assert.h),防止str为空指针。若为空指针(==0),会报错,而且会指出错误的位置,提醒你修改int count = 0;while(*str++) // == if(*str++ != \0){count++;}return count;
}int main()
{char arr[] = "abcdef";printf("%zd\n", my_strlen1(arr));//链式访问(一个函数的返回值是另一个函数的参数)return 0;
}
- 递归
#include <stdio.h>
#include <assert.h>size_t my_strlen2(const char* str)//str指向的字符不需要修改,可以加上const保护字符,防止其被修改
{assert(str);//断言(需要头文件assert.h),防止str为空指针。若为空指针(==0),会报错,而且会指出错误的位置,提醒你修改if (*str != '\0'){return my_strlen2(str + 1) + 1;}else{return 0;}
}int main()
{char arr[] = "abcdef";printf("%zd\n", my_strlen2(arr));//链式访问(一个函数的返回值是另一个函数的参数)return 0;
}
- 指针 - 指针
#include <stdio.h>
#include <assert.h>size_t my_strlen3(const char* str)//str指向的字符不需要修改,可以加上const保护字符,防止其被修改
{assert(str);//断言(需要头文件assert.h),防止str为空指针。若为空指针(==0),会报错,而且会指出错误的位置,提醒你修改char *start = str;while (*str){str++;}return str - start;
}int main()
{char arr[] = "abcdef";size_t len = my_strlen3(arr);printf("%zd\n", len);//链式访问(一个函数的返回值是另一个函数的参数)return 0;
}
2.长度不受限制的字符串函数
不关心目标空间够不够大
不关心操作字符串的长度
2.1 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).
将源指向的 C 字符串复制到目标指向的数组中,包括终止的 null(‘\0’) 字符(并在该点停止)。
- 源字符串必须以 ‘\0’ 结束。
- 会将源字符串中的 ‘\0’ 拷贝到目标空间。
- 目标空间必须足够大,以确保能存放源字符串。(否则会报错)
- 目标空间必须可变。(因为要把另一个字符串拷贝到这里)
- 返回值是目标空间的起始地址,然后通过%s来打印,%s是从给的地址开始 *解引用打印,遇到’\0’结束。
- 学会模拟实现。
模拟实现strcpy:
#include <stdio.h>
#include <assert.h>
char* my_strcpy(char* destination, const char* source)
//source指向的源字符串不需要改变,可以用const保护起来
//destination指向的目标空间必须可变,不能用const修饰{assert(destination && source);//断言(需要头文件assert.h),防止str为空指针。若为空指针(==0),会报错,而且会指出错误的位置,提醒你修改char* start = destination;while (*destination++ = *source++)//当*source=='\0'时,整个表达式的结果为'\0',//又因为'\0'的ASCII码(在内存中存储的I)是0,所以为假,循环结束{;}return start;
}int main()
{char arr1[20] = "xxxxxxxxxx";char arr2[] = "abcdef";my_strcpy(arr1, arr2);printf("%s\n", arr1);//或printf("%s\n", my_strcpy);return 0;
}
1.3 strcat(字符串追加)
具体介绍链接
char * strcat ( char * destination, const char * source );
介绍:
注:将源字符串追加到目标字符串中,源字符串的结束标志 ‘\0’ 被 source的第一个字符覆盖,并且在两者串联形成的新字符串的末尾包含一个’\0’(相当于将源字符串的’\0’也追加过去) 。
-
目标空间必须要有’\0’,保证能找到目标空间的末尾,进行追加。(编译器认为从左到右第一个’\0’是字符串的末尾)
-
源字符串必须以 ‘\0’ 结束。(在追加时源字符串的’\0’也追加过去)
-
目标空间必须有足够的大,能容纳下源字符串的内容。
-
目标空间必须可修改。
-
strcat返回的是目标空间的起始地址。
-
学会模拟实现。
模拟实现strcat :
//模拟实现strcat
#include <stdio.h>
#include <assert.h>char* my_strcat(char* des, const char* sou)
{char* start = des;assert(des && sou);//断言//1.找到目标字符串的末尾('\0')while (*des)//找到末尾'\0'后跳出循环{des++;}//2.数据追加while (*des++ = *sou++)//将源字符串的末尾'\0'拷贝过去的同时也结束拷贝{;}return start;
}int main()
{char arr1[20] = "abc";char arr2[] = "def";my_strcat(arr1, arr2);printf("%s\n", arr1);//printf("%s\n", strcat(arr1, arr2));return 0;
}
- 字符串自己给自己追加,会发生什么呢?
- 若用刚刚自己模拟的函数追加,会死循环。
2. 用vs自带的库函数却能正常追加
这说明vs库函数中strcat的实现方式和自己的实现方式有所差异,其实不同编译器对库函数的实现方式都可能有所差异。所以stccat在VS上能自己追加自己,但其他编译器不一定可以。
若非要自己追加自己,建议使用strncat。
2.3 strcmp(字符串比较)
具体介绍链接
int strcmp ( const char * str1, const char * str2 );
介绍:
C语言标准规定:
- 此函数开始比较每个字符串的第一个字符,如果它们相等,则继续向下比较,直到字符不同或达到终止空字符(‘\0’)。
- 比较的不是长度,而是对应位置上字符的大小(ASCII码,因为字符在内存中是以ASCII码的形式存储的)
返回值(整型) | 解释 |
---|---|
大于 0 | 第一个字符串大于第二个字符串 |
0 | 第一个字符串等于第二个字符串 |
小于 0 | 第一个字符串小于第二个字符串 |
不同的编译器具体返回的值不同
模拟实现strcmp :
//模拟实现strcmp
#include <stdio.h>
#include <assert.h>int my_strcmp(const char* str1, const char* str2)
{assert(str1 && str2);//断言,防止为空指针while (*str1 == *str2){if (*str1 == '\0')//同时为'\0'时,两个字符串才相等{return 0;}str1++;str2++;}return *str1 - *str2;//或//if (*str1 > *str2)//{// return 1;//}//else//{// return -1;//}}int main()
{char arr1[] = "abcdef";char arr2[] = "abp";if (my_strcmp(arr1, arr2) > 0){printf(">\n");}else if(my_strcmp(arr1, arr2) == 0){printf("=\n");}else{printf("<\n");}return 0;
}
从这分成两篇博文:
总结
我们一起学习了计算字符串长度的函数和长度不受限制的字符串函数。
感谢大家的阅读,大家一起进步!
点赞收藏加关注,C语言学习不迷路!
相关文章:

字符串函数(一)
✨博客主页:小钱编程成长记 🎈博客专栏:进阶C语言 字符串函数(一) 0.前言1.求字符串长度的函数1.1 strlen(字符串长度) 2.长度不受限制的字符串函数2.1 strcpy(字符串拷贝࿰…...

Ubuntu 安装 Docker 的详细步骤
文章目录 简介1.更新2.安装必要的软件包2.1 基于阿里源 3.验证 Docker 安装是否成功4.安装后的一些常规设置及常用的命令4.1 启动 Docker4.2 Docker 在系统启动时自动运行4.3 运行一个 Hello World 镜像4.4 查看docker运行状态 欢迎来到这篇关于在 Ubuntu 上安装 Docker 的教程…...

使用Python进行App用户细分
App用户细分是根据用户与App的互动方式对用户进行分组的任务。它有助于找到保留用户,找到营销活动的用户群,并解决许多其他需要基于相似特征搜索用户的业务问题。这篇文章中,将带你完成使用Python进行机器学习的App用户细分任务。 App用户细…...
博弈论——伯特兰德寡头模型(Bertrand Model)
伯特兰德寡头模型(Bertrand Model) 0 引言 在前面几篇文章中,我们介绍了古诺模型(Cournot duopoly model)和斯塔克尔伯格模型(Stackelberg model) 博弈论——连续产量古诺模型(Cournot duopoly model) 博弈论——斯塔克尔伯格模型(Stackelberg model) 这两个模型…...
第一百六十回 SliverPadding组件
文章目录 概念介绍使用方法示例代码 我们在上一章回中介绍了SliverAppBar组件相关的内容,本章回中将介绍 SliverPadding组件.闲话休提,让我们一起Talk Flutter吧。 概念介绍 我们在本章回中介绍的SliverPadding组件类似Pading组件,它主要用…...

Mapfree智驾方案,怎样实现成本可控?
整理|睿思 编辑|祥威 编者注:本文是HiEV出品的系列直播「智驾地图之变」第二期问答环节内容整理。 元戎启行副总裁刘轩与连线嘉宾奥维咨询董事合伙人张君毅、北汽研究总院智能网联中心专业总师林大洋、主持嘉宾周琳展开深度交流,并进行了答疑。 本期元…...

javascript: Bubble Sort
// Sorting Algorithms int JavaScript /** * file Sort.js * 1. Bubble Sort冒泡排序法 */ function BubbleSort(arry, nszie) {var i, j, temp;var swapped;for (i 0; i < nszie - 1; i){swapped false;for (j 0; j < nszie - i - 1; j){if (arry[j] > arry[j …...
DM数据库根据rowid删除重复的记录
oracle中rowid的用法-CSDN博客 delete from stu a where rowid not in (select max(b.rowid) from stu b where a.nob.no and a.name b.name and a.sex b.sex); //这里max使用min也可以...

【AI视野·今日Robot 机器人论文速览 第四十期】Mon, 25 Sep 2023
AI视野今日CS.Robotics 机器人学论文速览 Mon, 25 Sep 2023 Totally 36 papers 👉上期速览✈更多精彩请移步主页 Interesting: 📚CloudGripper, 一套云化的机器抓取人数据采集系统,包含了32个机械臂的集群。(from KTH Royal Institute of Te…...

HashMap底层源码,数据结构
HashMap的底层结构在jdk1.7中由数组链表实现,在jdk1.8中由数组链表红黑树实现,以数组链表的结构为例。 JDK1.8之前Put方法: JDK1.8之后Put方法: HashMap基于哈希表的Map接口实现,是以key-value存储形式存在,…...

计算机等级考试—信息安全三级真题八
一、单选题...

番外6:下载+安装+配置Linux
#########配置Linux---后续 step08: 点击编辑虚拟机设置,选择下载好的映像文件.iso进行挂载; step09: 点击编辑虚拟机选项,选择UEFI启动模式并点击确定; step10: 点击开启虚拟机,选择Install rhel ; 备注&…...
javascript验证表单字段有效性,使用checkValidity()方法和他的属性
<script type"text/javascript">function LoginCheckValidity(){var txt"";var rmb1document.getElementById("rmb1");if(rmb1.checkValidity()false){if(rmb1.validitionMessageundefined){txt"输入金额有误,金额10-200之间";}…...

pdf怎么调整大小kb?pdf文件过大这样压缩
在日常的工作和生活中,我们常常会遇到需要调整PDF文件大小的问题。有时候,我们需要将大型的PDF文件上传到某些平台,但平台的限制让我们不得不压缩文件的大小。那么,如何有效地调整PDF文件的大小呢? 一、使用嗨格式压缩…...
vue3中的watch
在Vue3中,watch中的参数可以分为两部分,即要监听的响应式数据以及回调函数。 语法格式如下: watch(要监听的响应式数据, 回调函数)除了以上的两个还有其他的参数 immediate:是否在初始化时立即执行一次回调函数,默认…...

开绕组电机零序Bakc EMF-based无感控制以及正交锁相环inverse Park-based
前言 最近看论文遇到了基于反Park变换的锁相环,用于从开绕组永磁同步电机零序电压信号中提取转子速度与位置信息,实现无感控制。在此记录 基于零序Back EMF的转子估算 开绕组电机的零序反电动势 e 0 − 3 ω e ψ 0 s i n 3 θ e e_0-3\omega_e\psi_…...

番外5:下载+安装+配置Linux
任务前期工作: 01. 电脑已安装好VMware Workstation软件; 02.提前下载好Rhel-8.iso映像文件(文件较大一般在9.4GB,建议采用迅雷下载),本人使用的以下版本(地址ed2k://|file|rhel-8.4-x86_64-dvd…...

新手--安装好Quartus II13.0(带modelsim集成包)并用Quartus II搭建一个工程
前言 今天是国庆节,我们正式来学习Quartus II13.0软件的安装与使用。学习verilog与学习C语言都是学习一门语言,那么学习一门语言,光看理论不敲代码绝对是学习不好的。要用verilog语言敲代码,就要像C语言那样搭建起语言的编译环境&…...
python监控软件内存、cpu和GDI
目录 前言代码 前言 最近做软件测试需要监控软件内存、cpu和GDI对象数,用psutil库可以很方便的实现监控内存和CPU,但是GDI好像还不行,最后来的win32api来调用的Windows API接口来实现GDI监控的,在此做个记录。 代码 import psu…...

wordpress搭建自己的博客详细过程以及踩坑
WordPress作为一款开源的内容管理系统(CMS),具有诸多优势。首先,它的易用性使得即使对于没有编程经验的用户来说也能轻松上手,通过直观的用户界面和友好的管理工具,用户可以方便地创建、编辑和发布内容。其…...

调用支付宝接口响应40004 SYSTEM_ERROR问题排查
在对接支付宝API的时候,遇到了一些问题,记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...

React第五十七节 Router中RouterProvider使用详解及注意事项
前言 在 React Router v6.4 中,RouterProvider 是一个核心组件,用于提供基于数据路由(data routers)的新型路由方案。 它替代了传统的 <BrowserRouter>,支持更强大的数据加载和操作功能(如 loader 和…...
C# SqlSugar:依赖注入与仓储模式实践
C# SqlSugar:依赖注入与仓储模式实践 在 C# 的应用开发中,数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护,许多开发者会选择成熟的 ORM(对象关系映射)框架,SqlSugar 就是其中备受…...

【论文阅读28】-CNN-BiLSTM-Attention-(2024)
本文把滑坡位移序列拆开、筛优质因子,再用 CNN-BiLSTM-Attention 来动态预测每个子序列,最后重构出总位移,预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵(S…...

解析奥地利 XARION激光超声检测系统:无膜光学麦克风 + 无耦合剂的技术协同优势及多元应用
在工业制造领域,无损检测(NDT)的精度与效率直接影响产品质量与生产安全。奥地利 XARION开发的激光超声精密检测系统,以非接触式光学麦克风技术为核心,打破传统检测瓶颈,为半导体、航空航天、汽车制造等行业提供了高灵敏…...

通过 Ansible 在 Windows 2022 上安装 IIS Web 服务器
拓扑结构 这是一个用于通过 Ansible 部署 IIS Web 服务器的实验室拓扑。 前提条件: 在被管理的节点上安装WinRm 准备一张自签名的证书 开放防火墙入站tcp 5985 5986端口 准备自签名证书 PS C:\Users\azureuser> $cert New-SelfSignedCertificate -DnsName &…...
32单片机——基本定时器
STM32F103有众多的定时器,其中包括2个基本定时器(TIM6和TIM7)、4个通用定时器(TIM2~TIM5)、2个高级控制定时器(TIM1和TIM8),这些定时器彼此完全独立,不共享任何资源 1、定…...

Linux-进程间的通信
1、IPC: Inter Process Communication(进程间通信): 由于每个进程在操作系统中有独立的地址空间,它们不能像线程那样直接访问彼此的内存,所以必须通过某种方式进行通信。 常见的 IPC 方式包括&#…...
游戏开发中常见的战斗数值英文缩写对照表
游戏开发中常见的战斗数值英文缩写对照表 基础属性(Basic Attributes) 缩写英文全称中文释义常见使用场景HPHit Points / Health Points生命值角色生存状态MPMana Points / Magic Points魔法值技能释放资源SPStamina Points体力值动作消耗资源APAction…...

Python环境安装与虚拟环境配置详解
本文档旨在为Python开发者提供一站式的环境安装与虚拟环境配置指南,适用于Windows、macOS和Linux系统。无论你是初学者还是有经验的开发者,都能在此找到适合自己的环境搭建方法和常见问题的解决方案。 快速开始 一分钟快速安装与虚拟环境配置 # macOS/…...