C语言-部分字符串函数详解 1-4

C语言-部分字符串函数详解 1-4

  • 前言
  • 1.`strlen`
    • 1.1基本用法
    • 1.2注意事项
      • `\0`
      • `size_t`
    • 1.3模拟实现
  • 2.`strcpy`
    • 2.1基本用法
    • 2.2注意事项
      • **源字符串必须以 `\0` 结束**
      • **会将源字符串中的 `\0`拷贝到目标空间**
      • **目标空间必须可修改**
      • **目标空间必须能容纳下源字符串的内容**
    • 2.3模拟实现
  • 3.`strncpy`
    • 3.1基本用法
    • 3.2注意事项
      • **原字符串长度小于`num`会补`0`**
      • **原字符串长度长于`num`需手动补`0`**
    • 3.3模拟实现
  • 4.`strcat`
    • 4.1基本用法
    • 4.2注意事项
      • **从`\0`开始连接,结束时会加`\0`**
      • **目标空间必须能容纳下源字符串的内容**
    • 4.3模拟实现

前言

本文将介绍<string.h>头文件下的部分字符串函数:

  • 1.strlen
  • 2.strcpy
  • 3.strncpy
  • 4.strcat
  • 5.strncat
  • 6.strcmp
  • 7.strncmp
  • 8.strstr
  • 9.strtok
  • 10.strerror

1.strlen


函数原型:size_t strlen ( const char * str );
简介:Get string length——获取字符串长度

1.1基本用法

char ch[20] = "Hello World!";
size_t len = strlen(ch);
printf("%zd\n", len);

在这里插入图片描述

1.2注意事项

\0

strlen返回的值为字符串开头和'\0'之间的字符数,因此,如果没有'\0',将越界访问,并返回随机值

char ch1[] = { 'a','b','c' };
char ch2[] = { 'a','b','c','\0' };
size_t len1 = strlen(ch1);
size_t len2 = strlen(ch2);
printf("%zd\n%zd\n", len1,len2);

在这里插入图片描述

VS2022也给出了相应的警告:
在这里插入图片描述

size_t

返回的是无符号整型,所以别用返回值相减:

char ch1[20] = "Hello";
char ch2[20] = "World!!";
if (strlen(ch1) - strlen(ch2)> 0)printf(">");
elseprintf("<");

在这里插入图片描述

1.3模拟实现

这里给出三种方法:
计数器

size_t my_strlen1(const char* p)
{assert(p);size_t count = 0;while (*p){p++;count++;}return count;
}

其中:

  • assert断言指针不为空
  • while\0处终止循环

指针-指针

size_t my_strlen2(const char* p)
{assert(p);char* start = p;while (*p)p++;return p - start;
}

其中:

  • start记录起始位置,p寻找\0
  • 指针-指针得到相距的元素个数

递归
原理如图:在这里插入图片描述

size_t my_strlen3(const char* p)
{assert(p);if (*p == '\0')return 0;else return 1 + my_strlen3(p + 1);
}

2.strcpy


函数原型:char * strcpy ( char * destination, const char * source );
简介:Copy string——拷贝字符串

2.1基本用法

char ch1[20] = "Hello World!";
char ch2[20];
strcpy(ch2, ch1);
printf(ch2);

在这里插入图片描述

2.2注意事项

源字符串必须以 \0 结束

char ch1[] = { 'a','b','c' };
char ch2[20];
strcpy(ch2, ch1);

在这里插入图片描述

VS2022给出了相应的警告:在这里插入图片描述

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

可简单验证:

char ch1[20] = "Hello World!";
char ch2[20] = "xxxxxxxxxxxxxxxxxx";
strcpy(ch2, ch1);

在这里插入图片描述

目标空间必须可修改

char ch1[20] = "Hello World!";
char* ch2 = "xxxxxxxxxxxxxxxxxx";
strcpy(ch2, ch1);

ch2为指针,指向常量字符串
在这里插入图片描述

目标空间必须能容纳下源字符串的内容

char ch1[20] = "Hello World!";
char ch2[1];
strcpy(ch2, ch1);

在这里插入图片描述

2.3模拟实现

char* my_strcpy(char* dst, const char* src)
{assert(dst && src);char* start = dst;while (*dst++ = *src++);return start;
}

其中:

  • *src\0赋值给*dst后,while循环停止

3.strncpy


函数原型:char * strncpy ( char * destination, const char * source, size_t num );
简介:Copy characters from string——从字符串拷贝字符

3.1基本用法

char ch1[] = "Hello World!xxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
char ch2[20];
strncpy(ch2, ch1, 12);
ch2[12] = '\0';
printf(ch2);

在这里插入图片描述

3.2注意事项

原字符串长度小于num会补0

char ch1[] = "Hello World!";
char ch2[20]="xxxxxxxxxxxxxxxxxxxx";
strncpy(ch2, ch1, 15);

在这里插入图片描述

原字符串长度长于num需手动补0

错误示范:

char ch1[] = "Hello World!xxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
char ch2[20];
strncpy(ch2, ch1, 12);
printf(ch2);

在这里插入图片描述

VS2022给出了相应的警告:
在这里插入图片描述

3.3模拟实现

char* my_strncpy(char* dst, const char* src, size_t num)
{assert(dst && src);char* ret = dst;while (*src && num){*dst++ = *src++;num--;}while (num--)*dst++ = 0;return ret;
}

4.strcat


函数原型:char * strcat ( char * destination, const char * source );
简介:Get string length——连接字符串

4.1基本用法

char ch1[20] = "Hello ";
char ch2[] = "World!";
strcat(ch1, ch2);
printf(ch1);

在这里插入图片描述

4.2注意事项

\0开始连接,结束时会加\0

char ch1[20] = "x\0xxxxxxxx";
char ch2[] = "aaaaa";
strcat(ch1, ch2);
printf(ch1);

在这里插入图片描述

目标空间必须能容纳下源字符串的内容

char ch1[] = "xxxxx";
char ch2[] = "aaaaa";
strcat(ch1, ch2);
printf(ch1);

在这里插入图片描述

VS2022给出了相应的警告:
在这里插入图片描述

4.3模拟实现

char* my_strcat(char* dst, const char* src)
{assert(dst && src);char* start = dst;while (*dst)dst++;while (*dst++ = *src++);return start;
}

希望本篇文章对你有所帮助!
本人仅仅是个C语言初学者,如有任何意见,欢迎各位提出!


相关文章:
C语言指针详解-上
C语言指针详解-下

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/404886.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RabbitMQ的核心概念

RabbitMQ是一个消息中间件&#xff0c;也是一个生产者消费者模型&#xff0c;负责接收&#xff0c;存储和转发消息。 核心概念 Producer 生产者&#xff0c;是RabbitMQ Server的客户端&#xff0c;向RabbitMQ发送消息。 Consumer 消费者&#xff0c;是RabbitMQ Server的客…

使用亮数据爬虫工具解锁复杂爬虫场景

在当今数据驱动型时代&#xff0c;数据采集和分析能力算是个人和企业的核心竞争力。然而&#xff0c;手动采集数据耗时费力且效率低下&#xff0c;而且容易被网站封禁。 我之前使用过一个爬虫工具&#xff0c;亮数据&#xff08;Bright Data&#xff09; &#xff0c;是一款低…

浅探空间智能

空间智能&#xff0c;这一概念在人工智能领域逐渐升温&#xff0c;部分归功于AI界的领军人物李飞飞博士所领导的创新项目。 Seeing is for doing and learning. 【精校】TED&#xff1a;李飞飞 | 空间智能让AI理解真实世界 2024.5 李飞飞在 X 上介绍称&#xff0c;「空间智能…

消防认证-火灾显示盘GB 17429-2011

一、消防认证 消防认证是指消防产品符合国家相关技术要求和标准&#xff0c;且通过了国家认证认可监督管理委员会审批&#xff0c;获得消防认证资质的认证机构颁发的证书&#xff0c;消防产品具有完好的防火功能&#xff0c;是住房和城乡建设领域验收的重要指标。 二、认证依据…

10结构型设计模式——桥接模式

一、桥接模式 桥接模式&#xff08;Bridge Pattern&#xff09;是结构型的设计模式之一。桥接模式基于类的最小设计原则&#xff0c;通过使用封装&#xff0c;聚合以及继承等行为来让不同的类承担不同的责任。它的主要特点是把抽象&#xff08;abstraction&#xff09;与行为实…

SystemUI下拉框新增音量控制条

Android产品下拉框一直只有亮度条没有音量控制条。 为了方便控制音量&#xff0c;普遍都是底部导航栏添加音量加减按钮&#xff0c;在Android10以后&#xff0c;大家普遍用上了手势导航&#xff0c;去掉底部导航栏。 目前需要再下拉框中可以直接控制音量。 文章目录 前言需求及…

day33

一、linux系统中的库 库在linux系统中是一个二进制文件&#xff0c;它是由XXX.c&#xff08;不包含main函数&#xff09;文件编译而来的&#xff0c;分为静态库和动态库。 库在系统中的内容是不可见的&#xff0c;是一个二进制乱码 当程序需要使用库中的相关函数时&#xff0c;…

安装docker 遇到异常Could not resolve host: mirrorlist.centos.org; 未知的错误

问题 安装docker 遇到异常 Could not retrieve mirrorlist http://mirrorlist.centos.org/?release7&archx86_64&repoos&infrastock error was 14: curl#6 - “Could not resolve host: mirrorlist.centos.org; 未知的错误” 1、安装Docker依赖包 yum install …

基于SpringBoot的论坛系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图详细视频演示技术栈系统测试为什么选择我官方认证玩家&#xff0c;服务很多代码文档&#xff0c;百分百好评&#xff0c;战绩可查&#xff01;&#xff01;入职于互联网大厂&#xff0c;可以交流&#xff0c;共同进步。有保障的售后 代码参考数据库参…

Android 12系统源码_多屏幕(二)模拟辅助设备功能开关实现原理

前言 上一篇我们通过为Android系统开启模拟辅助设备功能开关&#xff0c;最终实现了将一个Activity显示到多个屏幕的效果。 本篇文章我们具体来分析一下当我们开启模拟辅助设备功能开关的时候&#xff0c;Android系统做了什么哪些操作。 一、模拟辅助设备功能开关应用位置 …

存储实验:华为异构存储在线接管与在线数据迁移(Smart Virtualization Smart Migration 特性)

目录 目的实验环境实验步骤参考文档1. 主机安装存储多路径2. v2存储创建Lun&#xff0c;映射给主机&#xff1b;主机分区格式化&#xff0c;写数据3. 将v2存储映射该成映射到v3存储上(v3存储和v2之间链路搭建&#xff0c;测通&#xff0c;远端设备&#xff09;&#xff08;Smar…

便利店(超市)管理系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图详细视频演示技术栈系统测试为什么选择我官方认证玩家&#xff0c;服务很多代码文档&#xff0c;百分百好评&#xff0c;战绩可查&#xff01;&#xff01;入职于互联网大厂&#xff0c;可以交流&#xff0c;共同进步。有保障的售后 代码参考数据库参…

中国:“虚拟资产”交易被列为公认的洗钱方式之一!最高法院承认加密货币交易!

2024年8月19日&#xff0c;最高人民法院和最高人民检察院表示&#xff0c;根据他们对反洗钱法的新解释&#xff0c;“虚拟资产”交易现已被列为公认的洗钱方式之一。这是中国首次针对此类资产类别采取此类举措&#xff0c;说明为应对加密货币和其他虚拟资产日益增长的使用&…

IO进程线程8.20

1.使用fgets获取文件的行号 #include <myhead.h> int main(int argc, const char *argv[]) {FILE *fp fopen("./1.txt","r");if(fpNULL){perror("fp");return -1;}char buf[30];int count 0;while(fgets(buf,sizeof(buf),fp)){count;}p…

为IntelliJ IDEA安装插件

安装插件 插件是开发工具的扩展程序&#xff0c;通常由第三方提供&#xff0c;当安装了插件后&#xff0c;原开发工作的菜单、按钮等开发环境可能会发生变化&#xff0c;例如出现了新的菜单项&#xff0c;或出现了新的按钮&#xff0c;甚至一些全新的编码方式&#xff0c;通常…

双向链表复习(C语言版)

目录 链表分类&#xff1a; 双向链表初始化&#xff1a; 双向链表的插入&#xff1a; 双向链表的打印&#xff1a; 双向链表的删除&#xff1a; 双向链表的指定结点位置查找&#xff1a; 双向链表的在指定位置之后插入数据&#xff1a; 注意&#xff1a;通过上文的指定…

地理科学专业| 中国大学排行榜(2024年)

地理科学专业| 中国大学排行榜&#xff08;2024年&#xff09;

客车制造5G智能工厂工业物联数字孪生平台,推进制造业数字化转型

制造业正经历着前所未有的变革&#xff0c;其中客车制造行业作为传统制造业的重要组成部分&#xff0c;正积极拥抱5G、工业物联网及数字孪生等先进技术&#xff0c;推动生产模式的全面升级与数字化转型。 客车制造5G智能工厂工业物联数字孪生平台的出现&#xff0c;不仅为行业…

【Linux】系列入门摘抄笔记-8-权限管理chmod/chown

Linux操作系统中文件的基本权限由9个字符组成&#xff0c;分别为属主、属组和其他用户&#xff0c;用于规定是否对文件有读、写和执行权限。 文件/目录的权限与归属 目录列表中&#xff0c;有9列 第一列&#xff1a;文件类型与权限&#xff08;共10个字符&#xff0c;分为四组…

电子木鱼+提肛+游戏地图,车机还能这么玩?

文/王俣祺 导语&#xff1a;电子木鱼、提肛训练、游戏级地图&#xff0c;你很难想象这些“直男关怀”是来自小鹏MONA M03的车机系统。最近&#xff0c;一批关于MONA M03车机功能的视频在网上疯传&#xff0c;一系列“没用但有趣”的功能广受年轻用户的好评&#xff0c;情绪价值…