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.mzph.cn/news/877501.shtml

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

相关文章

【深度学习】【语音TTS】GPT-SoVITS v2 实战,训练一个人的音色,Docker镜像

文章目录 原理Dockerdocker push训练教程: https://www.yuque.com/baicaigongchang1145haoyuangong/ib3g1e/xyyqrfwiu3e2bgyk 原理 Docker 不用docker不行,不好分配显卡, 做个docker镜像: docker pull pytorch/pytorch:2.1.2

接口基础知识9:详解response body(响应体)

课程大纲 一、定义 HTTP响应体&#xff08;HTTP Response Body&#xff09;&#xff1a;服务器返回给客户端的数据部分&#xff0c;‌它包含了服务器对客户端请求的响应内容&#xff08;如客户端请求的资源、客户端请求的执行结果&#xff09;。 与请求类似&#xff0c;HTTP …

python之matplotlib (3 坐标轴设置)

写在前面 在说明坐标轴设置之前&#xff0c;我有必要和大家说清楚图像设置的一些方法&#xff0c;避免陷入困扰模糊的地步。前面我们说过&#xff0c;画图的三种方法&#xff08;python之matplotlib &#xff08;1 介绍及基本用法&#xff09;-CSDN博客&#xff09;。而设置也…

2024开源资产管理系统推荐 8款免费开源IT资产管理系统/软件

开源资产管理系统 开源资产管理系统是帮助企业管理、跟踪和优化其资产的强大工具。这些系统能够自动记录资产的详细信息&#xff0c;如采购日期、使用情况、维护记录等&#xff0c;从而实现资产的全生命周期管理。企业可以通过这些系统优化资产使用效率&#xff0c;减少资产闲…

【TCP】确认应答、超时重传机制和TCP报头

TCP 相关机制 TCP 基本特点&#xff1a;有连接、可靠传输、面向字节流、全双工 有连接、面向字节流和全双工都能在前面的代码中体现有连接&#xff1a;必须要先调用 accept 建立联系才能处理面向字节流&#xff1a;会拿到 clientSocket 对象的 InputStream 和 OutputStream&a…

python人工智能002:jupyter基本使用

小知识&#xff1a;将jupyter修改为中文&#xff0c;修改用户变量&#xff0c; 注意是用户变量&#xff0c;不是系统变量 新增用户变量 变量名&#xff1a;LANG 变量值&#xff1a;zh_CN.UTF8 然后重启jupyter 上一章的软件安装完成之后&#xff0c;就可以创建文件夹来学习写…

MaxKB(二):Ubuntu24.04搭建maxkb开发环境

接上文&#xff1a;windows10搭建maxkb开发环境&#xff08;劝退指南&#xff09; 上文在windows10环境搭建maxkb开发环境遇到各种坑&#xff0c;后面就转战ubuntu平台&#xff0c;果然比较顺利的完成开发环境搭建。当然遇到相关的问题还是可以参考上文《windows10搭建maxkb开发…

拟合与插值|线性最小二乘拟合|非线性最小二乘拟合|一维插值|二维插值

挖掘数据背后的规律是数学建模的重要任务&#xff0c;拟合与插值是常用的分析方法 掌握拟合与插值的基本概念和方法熟悉Matlab相关程序实现能够从数据中挖掘数学规律 拟合问题的基本提法 拟合问题的概念 已知一组数据(以二维为例)&#xff0c;即平面上n个点 ( x i , y i ) …

C语言指针详解-上

C语言指针详解-上 前言1.指针的基本概念1.1指针是什么1.2指针的声明与初始化1.3取地址符&和解引用符*& 运算符用于**获取变量的地址*** 运算符用于访问指针指向的值 2.指针的类型常见数据类型的指针指针与数组、字符串数组指针结构体指针函数指针二级指针void指针 3.指…

对零基础想转行网络安全同学的一点建议

最近有同学在后台留言&#xff0c;0基础怎么学网络安全&#xff1f;0基础可以转行做网络安全吗&#xff1f;以前也碰到过类似的问题&#xff0c;想了想&#xff0c;今天简单写一下。 我的回答是先了解&#xff0c;再入行。 具体怎么做呢&#xff1f; 首先&#xff0c;你要确…

滑动变阻器的未来发展趋势和前景如何?是否有替代品出现?

滑动变阻器是常见的电子元件&#xff0c;主要用于调节电路中的电阻值。随着科技的不断发展&#xff0c;滑动变阻器的未来发展趋势和前景也引起了广泛关注。 滑动变阻器的未来发展将更加注重智能化&#xff0c;随着物联网、人工智能等技术的快速发展&#xff0c;滑动变阻器也将与…

C语言 | Leetcode C语言题解之第347题前K个高频元素

题目&#xff1a; 题解&#xff1a; struct hash_table {int key;int val;// 查看 https://troydhanson.github.io/uthash/ 了解更多UT_hash_handle hh; };typedef struct hash_table* hash_ptr;struct pair {int first;int second; };void swap(struct pair* a, struct pair*…

YUM和NFS

文章目录 yum软件仓库的提供方式RPM软件包的来源Linux系统各家厂商用的安装源命令---yum 配置本地yum源具体操作 搭建ftp yum仓库环境具体操作实操环境服务端一、安装 vsftpd服务二、创建一个文件&#xff0c;并且挂载三、开启服务四、查看挂载 客户端五、备份六、搭建ftp yum仓…

【联想电脑】:使用拓展坞后转接HDMI,无法识别显示屏

项目场景&#xff1a; 作为一个嵌入式软件开发者&#xff0c;有两个外接屏幕&#xff0c;不足为奇。 但是在今天的使用电脑过程中&#xff0c;出现了接了一个拓展坞上面有HDMI接口&#xff0c;但是HDMI接口接上外接显示屏的时候电脑无法识别到&#xff0c;导致只有电脑直连的HD…

使用Docker-compose一键部署Wordpress平台

一、Docker-compose概述&#xff1a; docker-compose&#xff1a;单机容器编排 Dockerfile&#xff1a;先配置好文件&#xff0c;然后build&#xff0c;镜像——>容器。 docker-compose&#xff1a;即可基于Dockerfile&#xff0c;也可以基于镜像&#xff0c;可以一键式拉…

安全基础学习-SM4加密算法

SM4 是一种中国国家密码标准(GB/T 32907-2016)中定义的分组加密算法,又称为“中国商用密码算法SM4”。它是由中国国家密码管理局发布的,并广泛应用于金融、电子商务和其他需要数据加密的场景。 1、SM4 算法概述 SM4 是一种对称加密算法,意味着加密和解密使用相同的密钥。…

使用WINUI3 编写一个小软件1 C#

本篇主要是记录安装和运行的问题。 先说安装 因为我是WIN11&#xff0c;所以勾了&#xff0c;如果你是WIN10就不用勾选11那个&#xff0c;但是我不确定用11要不要10那个&#xff0c;所以就勾了&#xff0c;按安装手册来的。 2、创建项目 照着选就完事了&#xff0c;别选错 这…

【数据结构与算法】快速排序

快速排序目录 一.快速排序的原理二.快速排序的图解三.快速排序的实现1.基准两边分2.分而治之 四.完整代码 一.快速排序的原理 每次选取第一个数为基准数.然后使用乾坤大挪移将大于或者小于基准的元素分别放置于基准数两边.继续分别对基准数两侧未排序的数据使用分治法进行处理…

springboot项目配置https安装ssl证书教程

1.将下载的ssl证书文件中的jks后缀文件放在/src/main/resource文件夹里面 2.在配置文件中&#xff08;yml后缀配置文件的格式不同&#xff09;添加如下配置即可

Postman接口测试项目实战

第 1 章 什么是接口测试 1.1、为什么要进行接口测试 目前除了特别Low的公司外&#xff0c;开发都是前后端分离的&#xff0c;就是说前端有前端的工程师进行编码&#xff0c;后端有后端的工程师进行编码&#xff0c;前后端进行数据基本都是通过接口进行交互的。 1.2、接口测…