C语言之字符串函数

C语言之字符串函数

文章目录

  • C语言之字符串函数
    • 1. strlen的使用和模拟实现
      • 1.1 strlen的使用
      • 1.2 strlen的模拟实现
    • 2. strcpy的使用和模拟实现
      • 2.1 strcpy的使用
      • 2.2 strncpy的使用
      • 2.3 strcpy的模拟实现
    • 3. strcat的使用和模拟实现
      • 3.1 strcat的使用
      • 3.2 strncat
      • 3.3 strcat的模拟实现
    • 4. strcmp 的使⽤和模拟实现
      • 4.1 strcmp的使用
      • 4.2 strncmp
      • 4.3 strcmp的模拟实现

1. strlen的使用和模拟实现

• 字符串以 ‘\0’ 作为结束标志,strlen函数返回的是在字符串中 ‘\0’ 前⾯出现的字符个数(不包含 ‘\0’ )。
• 参数指向的字符串必须要以 ‘\0’ 结束。
• 注意函数的返回值为size_t,是⽆符号的

1.1 strlen的使用

strlen函数的声明

size_t strlen ( const char * str );

strlen函数是用来计算字符串的长度的,计算的是 ’ \0 '之前字符的总个数

例子:

#include <stdio.h>
#include <string.h>  //使用strlen需要包含的头文件
int main()
{char arr[] = "abcdef";strlen(arr);printf("%s\n", arr);return 0;
}

运行结果为 6

sizeof不同的是,sizeof计算的数组中的元素个数包括’ \0 ',详细可看sizeof和strlen

1.2 strlen的模拟实现

strlen传一个地址,然后它就会计算’\0’之前字符的总个数,并且返回值是size_t即无符号整型
代码如下:

#include <stdio.h>
#include <string.h>
#include <assert.h>
size_t my_strlen1(const char* str)//通过计数器的方式
{assert(str != NULL);    //assert断言,判断传入的地址是否为空指针int count = 0;               while (*str != '\0')//str中的内容不为'\0'的时候进入循环{count++;str++;}return count;}
size_t my_strlen2(const char* str)//指针 - 指针 计算的是两个指针之间的元素个数
{char* start = str;assert(str != NULL);while (*str != '\0'){str++;}return str - start;}
size_t my_strlen3(const char* str) //递归的方式
//假设传入一个字符串"abc"
//递的过程
//第一次进入函数,*str == a   调用本身1 + my_strlen3("bc")
//第二次进入函数,*str == b   调用本身1 + 1 + my_strlen3("c")
//第三次进入函数,*str == c   调用本身1 + 1 + 1 + my_strlen3(" ")
//第四次进入函数,*str == '\0' ,开始归
//第四次返回一个0,0 + 1 + 1 + 1
{if (*str == '\0')return 0;elsereturn 1 + my_strlen3(str+1);
}int main()
{char arr[] = "abcdef";size_t len1 =  my_strlen1(arr);size_t len2 =  my_strlen2(arr);size_t len3 =  my_strlen3(arr);printf("%zd\n",len1 );printf("%zd\n",len2 );printf("%zd\n",len3 );return 0;
}

以上为三种strlen的模拟实现,代码运行如下:
在这里插入图片描述

2. strcpy的使用和模拟实现

• 源字符串必须以 ‘\0’ 结束。
• 会将源字符串中的 ‘\0’ 拷⻉到⽬标空间。
• ⽬标空间必须⾜够⼤,以确保能存放源字符串。
• ⽬标空间必须可修改。

2.1 strcpy的使用

函数声明如下:

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

strcpy用来将source中的字符串,拷贝到destination中去

例子:

#include <stdio.h>
#include <string.h>int main()
{char arr1[20] = { "xxxxxxxx"};char arr2[] = "abc";strcpy(arr1, arr2);printf("%s\n", arr1);return 0;
}

代码运行结果如下:
在这里插入图片描述
在这里插入图片描述
可以看到strcpy将arr2中的元素拷贝了一份到arr1中,同时在后面加上了一个’\0’,所以abc之后的x不会打印

2.2 strncpy的使用

要想拷贝指定数量的元素可以使用strncpy

函数声明如下:

char * strncpy ( char * destination, const char * source, size_t num );

strcpy差不多,只是多了一个size_t num这个形参,这个是用来拷贝指定数量的
例子:

#include <stdio.h>
#include <string.h>
int main()
{char arr1[20] = { 0 };char arr2[] = "abcdef";strncpy(arr1, arr2,3);printf("%s\n", arr1);return 0;
}

代码运行结果如下:

在这里插入图片描述
只会将arr2中前面3个元素拷贝到arr1中

2.3 strcpy的模拟实现

strcpy是用来将两个数组中下标一致的元素,将source中的字符拷贝到destination中去,一个一个拷贝

代码如下:

写法一:

char* my_strcpy(char* dest, char* src)
{char* ret = dest;assert(dest != NULL);assert(src != NULL);while (*src) //当src中的元素不为'\0'时进入循环{*dest = *src;   //将src中的值赋给dest*src++;         //src++,找到下一个元素的地址*dest++;        //dest++,找到下一个元素的地址}*dest = *src;   //由于当src中的元素为'\0'时,循环结束了,'\0'不会赋值到dest中去,使用最后将'\0'赋值给destreturn ret;
}
int main()
{char arr1[20] = { 0 };char arr2[] = "abcdef";my_strcpy(arr1, arr2);printf("%s\n", arr1);return 0;
}

写法二:

```c
#include <stdio.h>
#include <string.h>
#include <assert.h>
char* my_strcpy(char* dest, char* src)
{char* ret = dest;assert(dest != NULL);  //判断传入的指针不是空指针assert(src != NULL);while (*dest++ = *src++)// *dest = *src  将src的值拷贝到dest//拷贝完之后,通过指针偏移找到下一个元素//++是先使用后加{//因为只是拷贝元素,while里面不做什么事//使用while必须跟一个语句,使用加上了一个空语句//使用大括号里边可以不加,但是加上会更清晰一点;}return ret;
}
int main()
{char arr1[20] = { 0 };char arr2[] = "abcdef";my_strcpy(arr1, arr2);printf("%s\n", arr1);return 0;
}

3. strcat的使用和模拟实现

• 源字符串必须以 ‘\0’ 结束。
• ⽬标字符串中也得有 \0 ,否则没办法知道追加从哪⾥开始。
• ⽬标空间必须有⾜够的⼤,能容纳下源字符串的内容。
• ⽬标空间必须可修改。

3.1 strcat的使用

函数声明如下:

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

strcat是将source中的元素追加到destination之后,可以理解为两个字符串的拼接

例子如下:

#include <stdio.h>
#include <string.h>int main()
{char arr1[20] = "hello ";char arr2[] = "world";strcat(arr1, arr2);printf("%s\n", arr1);return 0;
}

3.2 strncat

要想追加指定元素,可以使用strncat
代码如下:

#include <stdio.h>
#include <string.h>int main()
{char arr1[20] = "hello ";char arr2[] = "worldabcdef";strncat(arr1, arr2,5);printf("%s\n", arr1);return 0;
}

运行结果如下:
在这里插入图片描述
只会将arr2中前五个元素追加到arr1中去,之后的元素则不会追加

3.3 strcat的模拟实现

strcat是先找到destination中的’\0’,然后再其后面开始追加元素
代码如下:

include <stdio.h>
#include <string.h>
#include <assert.h>char* my_strcat(char* dest, const char* src)
{char* ret = dest;assert(dest && src);while (*dest) //当dest中的元素不为'\0'时,dest++,找到'\0'的位置{dest++;}while (*dest++ = *src++)  //从'\0'之后的位置开始将src中的元素赋值给dest{;}return ret;
}
int main()
{char arr1[20] = "hello ";char arr2[] = "world";my_strcat(arr1, arr2);printf("%s\n", arr1);return 0;
}

4. strcmp 的使⽤和模拟实现

◦ 第⼀个字符串⼤于第⼆个字符串,则返回⼤于0的数字
◦ 第⼀个字符串等于第⼆个字符串,则返回0
◦ 第⼀个字符串⼩于第⼆个字符串,则返回⼩于0的数字
◦ 比较的是两个元素的ASCII值

4.1 strcmp的使用

函数声明如下:

int strcmp ( const char * str1, const char * str2 );

比较str1和str2中下标相同元素的ASCII值
如果第一个元素相等时,则比较下一对元素的ASCII值
大于则返回一个大于零的值
小于则返回一个小于零的值
等于则返回零

例子:

#include <stdio.h>
#include <string.h>int main()
{char arr1[] = "abcd";char arr2[] = "abq";int ret = strcmp(arr1, arr2);if (ret > 0)printf("大于\n");else if (ret == 0)printf("等于\n");elseprintf("小于\n");return 0;
}

由于前两个元素相同,所以比较第三个元素的ASCII值
q的ASCII值大于c的ASCII值
所以会打印小于

4.2 strncmp

可以指定比较的元素个数
代码如下:

#include <stdio.h>
#include <string.h>int main()
{char arr1[] = "abcd";char arr2[] = "abq";int ret = strncmp(arr1, arr2,2);if (ret > 0)printf("大于\n");else if (ret == 0)printf("等于\n");elseprintf("小于\n");return 0;
}

由于只比较了前两个元素的ASCII值,前两个元素相等
所以会打印等于

4.3 strcmp的模拟实现

代码如下:

#include <stdio.h>
#include <string.h>
#include <assert.h>int my_strcmp(const char* str1, const char* str2)
{assert(str1 && str2);while (*str1 == *str2){if (*str1 == '\0')return 0;str1++;str2++;}return *str1 - *str2;}
int main()
{char arr1[] = "abcd";char arr2[] = "abq";int ret = my_strcmp(arr1, arr2);if (ret > 0)printf("大于\n");else if (ret == 0)printf("等于\n");elseprintf("小于\n");return 0;
}

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

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

相关文章

C语言--每日五道选择题--Day23

第一题 1. 已知int i1, j2;&#xff0c;则表达式ij的值为&#xff08; &#xff09; A&#xff1a;1 B&#xff1a;2 C&#xff1a;3 D&#xff1a;4 答案及解析 C 本题考查的是前置和后置的优先级&#xff0c;后置的优先级是高于前置的&#xff0c;所以这个表达式就可以转变为…

【Spark源码分析】事件总线机制分析

Spark事件总线机制 采用Spark2.11源码&#xff0c;以下类或方法被DeveloperApi注解额部分&#xff0c;可能出现不同版本不同实现的情况。 Spark中的事件总线用于接受事件并提交到对应的监听器中。事件总线在Spark应用启动时&#xff0c;会在SparkContext中激活spark运行的事件总…

什么是持续集成的自动化测试?

持续集成的自动化测试 如今互联网软件的开发、测试和发布&#xff0c;已经形成了一套非常标准的流程&#xff0c;最重要的组成部分就是持续集成&#xff08;Continuous integration&#xff0c;简称CI&#xff0c;目前主要的持续集成系统是Jenkins&#xff09;。 那么什么是持…

docker 安装常用环境

一、 安装linux&#xff08;完整&#xff09; 目前为止docker hub 还是被封着&#xff0c;用阿里云、腾讯云镜像找一找版本直接查就行 默认使用latest最新版 #:latest 可以不写 docker pull centos:latest # 拉取后查看 images docker images #给镜像设置标签 # docker tag […

FIB表与快速转发表工作原理

在一张路由表中&#xff0c;当存在多个路由项可同时匹配目的IP地址时&#xff0c;路由查找进程会选择掩码最长的路由项用于转发&#xff0c;即最长匹配原则。因为掩码越长&#xff0c;所处的网段范围就越小&#xff0c;网段的范围越小&#xff0c;就越能快速的定位到PC机的具体…

【分布式】小白看Ring算法 - 03

相关系列 【分布式】NCCL部署与测试 - 01 【分布式】入门级NCCL多机并行实践 - 02 【分布式】小白看Ring算法 - 03 【分布式】大模型分布式训练入门与实践 - 04 概述 NCCL&#xff08;NVIDIA Collective Communications Library&#xff09;是由NVIDIA开发的一种用于多GPU间…

通过 python 脚本迁移 Redis 数据

背景 需求&#xff1a;需要将的 Redis 数据迁移由云厂商 A 迁移至云厂商 B问题&#xff1a;云版本的 Redis 版本不支持 SYNC、MIGRATE、BGSAVE 等命令&#xff0c;使得许多工具用不了&#xff08;如 redis-port&#xff09; 思路 &#xff08;1&#xff09;从 Redis A 获取所…

GoLand 2023.2.5(GO语言集成开发工具环境)

GoLand是一款专门为Go语言开发者打造的集成开发环境&#xff08;IDE&#xff09;。它能够提供一系列功能&#xff0c;如代码自动完成、语法高亮、代码格式化、代码重构、代码调试等等&#xff0c;使编写代码更加高效和舒适。 GoLand的特点包括&#xff1a; 1. 智能代码补全&a…

json 去除特殊字符换行等符号

由于字符串中有出现了 换行符&#xff0c;导致转json失败&#xff0c;报错&#xff1a;json parse error。 一般来讲&#xff0c;直接用string的replace方法就可以了 String str "{\"adrdet\":\"阿歌嘎\n嘎、\",\"date\":\"2023/06/…

Ubuntu安装CUDA驱动

Ubuntu安装CUDA驱动 前言官网安装确认安装版本安装CUDA Toolkit 前言 CUDA驱动一般指CUDA Toolkit&#xff0c;可通过Nvidia官网下载安装。本文介绍安装方法。 官网 CUDA Toolkit 最新版&#xff1a;CUDA Toolkit Downloads | NVIDIA Developer CUDA Toolkit 最新版文档&…

NX二次开发UF_CAM_update_list_object_customization 函数介绍

文章作者&#xff1a;里海 来源网站&#xff1a;https://blog.csdn.net/WangPaiFeiXingYuan UF_CAM_update_list_object_customization Defined in: uf_cam.h int UF_CAM_update_list_object_customization(tag_t * object_tags ) overview 概述 This function provids the…

UDP客户端使用connect与UDP服务器使用send函数和recv函数收发数据

服务器代码编译运行 服务器udpconnectToServer.c的代码如下&#xff1a; #include<stdio.h> #include<stdlib.h> #include<string.h> #include<unistd.h> #include<arpa/inet.h> #include<sys/socket.h> #include<errno.h> #inclu…

Okhttp 浅析

安全的连接 OkHttpClient: OkHttpClient: 1.线程调度 2.连接池,有则复用,没有就创建 3.interceptor 4.interceptor 5.监听工厂 6.是否失败重试 7.自动修正访问,如果没有权限或认证 8是否重定向 followRedirects 9.协议切换时候是否继续重定向 10.Cookie jar 容器 默认…

Python 的 socket 模块套接字编程(简单入门级别)

Python 的 socket 模块提供了对套接字编程的支持&#xff0c;允许你在网络上进行数据传输。套接字是一个抽象的概念&#xff0c;它允许程序在网络中的不同节点之间进行通信。 下面是 socket 模块中一些常用的函数和类&#xff1a; 1. 创建套接字&#xff1a; socket.socket(…

pycharm 创建的django目录和命令行创建的django再使用pycharm打开的目录对比截图 及相关

pytcharm创建django的项目 命令行创建的django 命令行创建项目时 不带路径时 (.venv) D:\gbCode>django-admin startproject gbCode 命令行创建项目时 带路径时 -- 所以如果有目录就指定路径好 (.venv) D:\gbCode>django-admin startproject gbCode d:\gbCode\

洛谷P1219 [USACO1.5] 八皇后【n皇后问题】【深搜+回溯 经典题】【附O(1)方法】

P1219 [USACO1.5] 八皇后 Checker Challenge 前言题目题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 提示题目分析注意事项 代码深搜回溯打表 后话额外测试用例样例输入 #2样例输出 #2 王婆卖瓜 题目来源 前言 也是说到做到&#xff0c;来做搜索的题&#xff08;虽…

微机原理_2

一、单项选择题(本大题共15小题,每小题3分,共45分。在每小题给出的四个备选项中,选出一个正确的答案&#xff0c;请将选定的答案填涂在答题纸的相应位置上。&#xff09; 下列数中最大的数为&#xff08;&#xff09; A. 10010101B B. (126)8 C. 96H D. 100 CPU 执行 OUT 60H,…

Android 9.0 隐藏设置显示中自动调节亮度

Android 9.0 隐藏设置显示中自动调节亮度 最近收到邮件需求提到想要隐藏设置显示中的自动调节亮度&#xff0c;具体修改参照如下&#xff1a; /vendor/mediatek/proprietary/packages/apps/MtkSettings/res/xml/display_settings.xml - <Preference<!--Preferencea…

西门子(Siemens)仿真PLC启动报错处理

目录 一、背景&#xff1a; 二、卸载软件 三、安装软件 三、启动软件 四、下载PORTAL项目 五、测试 一、背景&#xff1a; 在启动S7-PLCSIM Advanced V3.0仿真PLC时报错&#xff0c;报错信息为&#xff1a;>>Siemens PLCSIM Virtual Switch<<is misconfigu…

Ubuntu 23.10 服务器版本 ifconfig 查不到网卡 ip(已解决)

文章目录 1、问题描述2、 解决方案 1、问题描述 服务器&#xff1a;ubuntu 23.10 经常会遇到虚拟机添加仅主机网卡后&#xff0c;通过 ifconfig 无法获取其网卡 ip 2、 解决方案 修改网卡配置文件&#xff1a; # 进入网卡配置文件目录 cd /etc/netplan # 备份原始文件 cp …