当前位置: 首页 > news >正文

字符串函数(一)

图片来源于网络

✨博客主页:小钱编程成长记
🎈博客专栏:进阶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的模拟实现的三种方法:

  1. 计数器
#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;
}
  1. 递归
#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;
}
  1. 指针 - 指针
#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;
}
  • 字符串自己给自己追加,会发生什么呢?
  1. 若用刚刚自己模拟的函数追加,会死循环。
    在这里插入图片描述

在这里插入图片描述
2. 用vs自带的库函数却能正常追加
在这里插入图片描述
这说明vs库函数中strcat的实现方式和自己的实现方式有所差异,其实不同编译器对库函数的实现方式都可能有所差异。所以stccat在VS上能自己追加自己,但其他编译器不一定可以。
若非要自己追加自己,建议使用strncat。

2.3 strcmp(字符串比较)

具体介绍链接

int strcmp ( const char * str1, const char * str2 );
介绍:
  1. 此函数开始比较每个字符串的第一个字符,如果它们相等,则继续向下比较,直到字符不同或达到终止空字符(‘\0’)
  2. 比较的不是长度,而是对应位置上字符的大小ASCII码,因为字符在内存中是以ASCII码的形式存储的)
C语言标准规定:
返回值(整型)解释
大于 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语言学习不迷路!
图片来源于网络

相关文章:

字符串函数(一)

✨博客主页&#xff1a;小钱编程成长记 &#x1f388;博客专栏&#xff1a;进阶C语言 字符串函数&#xff08;一&#xff09; 0.前言1.求字符串长度的函数1.1 strlen&#xff08;字符串长度&#xff09; 2.长度不受限制的字符串函数2.1 strcpy&#xff08;字符串拷贝&#xff0…...

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的互动方式对用户进行分组的任务。它有助于找到保留用户&#xff0c;找到营销活动的用户群&#xff0c;并解决许多其他需要基于相似特征搜索用户的业务问题。这篇文章中&#xff0c;将带你完成使用Python进行机器学习的App用户细分任务。 App用户细…...

博弈论——伯特兰德寡头模型(Bertrand Model)

伯特兰德寡头模型(Bertrand Model) 0 引言 在前面几篇文章中&#xff0c;我们介绍了古诺模型(Cournot duopoly model)和斯塔克尔伯格模型(Stackelberg model) 博弈论——连续产量古诺模型(Cournot duopoly model) 博弈论——斯塔克尔伯格模型(Stackelberg model) 这两个模型…...

第一百六十回 SliverPadding组件

文章目录 概念介绍使用方法示例代码 我们在上一章回中介绍了SliverAppBar组件相关的内容&#xff0c;本章回中将介绍 SliverPadding组件.闲话休提&#xff0c;让我们一起Talk Flutter吧。 概念介绍 我们在本章回中介绍的SliverPadding组件类似Pading组件&#xff0c;它主要用…...

Mapfree智驾方案,怎样实现成本可控?

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

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 &#x1f449;上期速览✈更多精彩请移步主页 Interesting: &#x1f4da;CloudGripper, 一套云化的机器抓取人数据采集系统&#xff0c;包含了32个机械臂的集群。(from KTH Royal Institute of Te…...

HashMap底层源码,数据结构

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

计算机等级考试—信息安全三级真题八

一、单选题...

番外6:下载+安装+配置Linux

#########配置Linux---后续 step08: 点击编辑虚拟机设置&#xff0c;选择下载好的映像文件.iso进行挂载&#xff1b; step09: 点击编辑虚拟机选项&#xff0c;选择UEFI启动模式并点击确定&#xff1b; step10: 点击开启虚拟机&#xff0c;选择Install rhel &#xff1b; 备注&…...

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文件过大这样压缩

在日常的工作和生活中&#xff0c;我们常常会遇到需要调整PDF文件大小的问题。有时候&#xff0c;我们需要将大型的PDF文件上传到某些平台&#xff0c;但平台的限制让我们不得不压缩文件的大小。那么&#xff0c;如何有效地调整PDF文件的大小呢&#xff1f; 一、使用嗨格式压缩…...

vue3中的watch

在Vue3中&#xff0c;watch中的参数可以分为两部分&#xff0c;即要监听的响应式数据以及回调函数。 语法格式如下&#xff1a; watch(要监听的响应式数据, 回调函数)除了以上的两个还有其他的参数 immediate&#xff1a;是否在初始化时立即执行一次回调函数&#xff0c;默认…...

开绕组电机零序Bakc EMF-based无感控制以及正交锁相环inverse Park-based

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

番外5:下载+安装+配置Linux

任务前期工作&#xff1a; 01. 电脑已安装好VMware Workstation软件&#xff1b; 02.提前下载好Rhel-8.iso映像文件&#xff08;文件较大一般在9.4GB&#xff0c;建议采用迅雷下载&#xff09;&#xff0c;本人使用的以下版本&#xff08;地址ed2k://|file|rhel-8.4-x86_64-dvd…...

新手--安装好Quartus II13.0(带modelsim集成包)并用Quartus II搭建一个工程

前言 今天是国庆节&#xff0c;我们正式来学习Quartus II13.0软件的安装与使用。学习verilog与学习C语言都是学习一门语言&#xff0c;那么学习一门语言&#xff0c;光看理论不敲代码绝对是学习不好的。要用verilog语言敲代码&#xff0c;就要像C语言那样搭建起语言的编译环境&…...

python监控软件内存、cpu和GDI

目录 前言代码 前言 最近做软件测试需要监控软件内存、cpu和GDI对象数&#xff0c;用psutil库可以很方便的实现监控内存和CPU&#xff0c;但是GDI好像还不行&#xff0c;最后来的win32api来调用的Windows API接口来实现GDI监控的&#xff0c;在此做个记录。 代码 import psu…...

wordpress搭建自己的博客详细过程以及踩坑

WordPress作为一款开源的内容管理系统&#xff08;CMS&#xff09;&#xff0c;具有诸多优势。首先&#xff0c;它的易用性使得即使对于没有编程经验的用户来说也能轻松上手&#xff0c;通过直观的用户界面和友好的管理工具&#xff0c;用户可以方便地创建、编辑和发布内容。其…...

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…...

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…...

大数据学习栈记——Neo4j的安装与使用

本文介绍图数据库Neofj的安装与使用&#xff0c;操作系统&#xff1a;Ubuntu24.04&#xff0c;Neofj版本&#xff1a;2025.04.0。 Apt安装 Neofj可以进行官网安装&#xff1a;Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...

相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解

【关注我&#xff0c;后续持续新增专题博文&#xff0c;谢谢&#xff01;&#xff01;&#xff01;】 上一篇我们讲了&#xff1a; 这一篇我们开始讲&#xff1a; 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下&#xff1a; 一、场景操作步骤 操作步…...

《通信之道——从微积分到 5G》读书总结

第1章 绪 论 1.1 这是一本什么样的书 通信技术&#xff0c;说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号&#xff08;调制&#xff09; 把信息从信号中抽取出来&am…...

vue3 定时器-定义全局方法 vue+ts

1.创建ts文件 路径&#xff1a;src/utils/timer.ts 完整代码&#xff1a; import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...

【决胜公务员考试】求职OMG——见面课测验1

2025最新版&#xff01;&#xff01;&#xff01;6.8截至答题&#xff0c;大家注意呀&#xff01; 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:&#xff08; B &#xff09; A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...

JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作

一、上下文切换 即使单核CPU也可以进行多线程执行代码&#xff0c;CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短&#xff0c;所以CPU会不断地切换线程执行&#xff0c;从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...

Linux离线(zip方式)安装docker

目录 基础信息操作系统信息docker信息 安装实例安装步骤示例 遇到的问题问题1&#xff1a;修改默认工作路径启动失败问题2 找不到对应组 基础信息 操作系统信息 OS版本&#xff1a;CentOS 7 64位 内核版本&#xff1a;3.10.0 相关命令&#xff1a; uname -rcat /etc/os-rele…...