字符串函数和内存函数详解(1)

🐵本文将通过函数原型、用法、模拟实现等多个方面全面讲解字符串的库函数

1.strlen📚

1.1函数用法📗

strlen函数用来计算字符串的长度,它会从接收到字符的地址开始读取直到遇到'\0',每读取一个非'\0'的字符长度+1,最后返回一个size_t(无符号)类型的数

strlen函数原型:

返回类型为size_t,参数是一个字符指针用来接收字符的地址

1.2具体实现📕

#include<stdio.h>
#include<string.h> //记得加上头文件int main()
{char arr[] = "abcedf";size_t len = strlen(arr);printf("%zd", len); //结果为6return 0;
}

1.3模拟实现📘

这里总结了三种strlen函数模拟实现的方法,分别为:计数器、指针-指针和递归

计数器

size_t my_strlen1(const char* arr) //计数器
{size_t count = 0;while (*arr++ != '\0'){count++;}return count;
}

递归

size_t my_strlen(const char* arr)
{if (*arr != '\0'){return 1 + my_strlen(++arr);}else{return 0;}
}

每次递归都判断以下arr指针是否指向'\0',如果是则返回0,不是则指向下一个字符进行判断并且长度+1

指针-指针

size_t my_strlen2(const char* arr)
{char* p = arr;while (*arr != '\0'){arr++;}return arr - p;
}

指针-指针用来计算两个指针之间元素的个数,先让p指向字符串的首地址,之后通过while循环使arr指向'\0',最后返回arr - p

2.strcpy📚

2.1函数用法📗

strcpy函数用来拷贝字符串将源数组中的字符串拷贝到目标数组中,但需要注意以下几点:

  • 目标数组可能没有'\0',所以strcpy再拷贝时会将源数组的'\0'也拷贝过去,也就是说源数组中必须有'\0'
  • 目标数组的空间必须足够大,确保其在被拷贝后能存放的下字符串
  • 目标数组必须可变,不能是常量字符串

strcpy函数原型:

返回类型为char*,destination用来接收目标数组的地址,source用来接收源数组的地址

2.2具体实现📕

#include<stdio.h>
#include<string.h>int main()
{char arr1[20] = { 0 }; //目标数组空间确保能存放源数组char arr2[] = "abcdef";strcpy(arr1, arr2);printf("%s", arr1); //结果为abcdefreturn 0;
}

2.3模拟实现📘

#include <stdio.h>
#include<assert.h>char* my_strcpy( char* des, const char*src)
{assert(des && src); //断言判断des和src是否时空指针char* ret = des; //将des的首地址赋给ret用来最后返回,因为des在++后不再指向首地址while (*des++ = *src++) //依次将字符赋给des直到'\0'循环终止{;}return ret;
}int main()
{char arr1[] = "abcdef";char arr2[20] = { 0 };char* ret = my_strcpy(arr2, arr1);printf("%s", ret);return 0;
}

3.strcat📚

3.1函数用法📗

strcat函数用来追加字符串,将源数组加到目标数组的末尾,即从目标数组的'\0'位置处开始追加;和strcpy函数需要注意的点一样:

  • 源数组必须有'\0'
  • 目标数组的空间必须足够大
  • 目标数组必须可变,不能是常量字符串

strcat函数原型:

返回类型为char*,destination用来接收目标数组的地址,source用来接收源数组的地址

3.2具体实现📕

#include<stdio.h>
#include<string.h>int main()
{char arr1[20] = "abc"; //目标空间必须足够大char arr2[] = "def";strcat(arr1, arr2);printf("%s", arr1); //结果为abcdefreturn 0;
}

3.3模拟实现📘

#include<stdio.h>
#include<assert.h>char* my_strcat(char* des, const char* src)
{assert(des && src); //断言判断des和src是否为空指针char* ret = des;while (*des != '\0') //先找到目标数组'\0'的位置{des++;}while (*des++ = *src++) //从目标数组的'\0'位置处开始依次将源数组拷贝到目标数组{;}return ret;
}int main()
{char arr1[20] = "abc";char arr2[] = "def";char* ret = my_strcat(arr1, arr2);printf("%s", ret);return 0;
}


4.strcmp📚

4.1函数用法📗

strcmp函数用来比较字符串,从两个字符串的第一个字符开始依次比较它们的ASCII码值,只要出现一个字符大于另一个字符就停止比较,此时较大字符所在的字符串大于另一个字符串

strcmp函数原型:

str1和str2分别接收要比较的两个数组的地址,返回类型为int,str1>str2则返回一个大于0的数,str1<str2则返回一个小于0的数,str1=str2则返回0

4.2具体实现📕

#include<stdio.h>
#include<string.h>int main()
{char arr1[] = "abcfff";char arr2[] = "abczz";int cmp = my_strcmp(arr1, arr2);if (cmp > 0){printf(">");    }else              {printf("<="); //结果为<=,因为f<z}return 0;
}

4.3模拟实现📘

#include<stdio.h>
#include<assert.h>int my_strcmp(const char* str1, const char* str2)
{assert(str1 && str2);while (*str1++ == *str2++) //依次比较两字符串的字符{if (*str1 == '\0' && *str2 == '\0'){return 0; //若两字符串的字符一直到'\0'都相等,则相等,返回0}}return *str1 - *str2; //*str1大返回大于0的数,否则返回小于0的数
}int main()
{char arr1[] = "abcfff";char arr2[] = "abczz";int cmp = my_strcmp(arr1, arr2);if (cmp > 0){printf(">");}else{printf("<=");}return 0;
}

5.strncpy📚

5.1函数用法📗

strncpy函数原型:

这里相较于strcpy多了一个参数num

用法:和strcpy用法相同,但它是将源数组的前num个字符拷贝到目标数组中

5.2具体实现📕

#include<stdio.h>int main()
{char arr1[] = "abcdef";char arr2[20] = { 0 };size_t num = 3;strncpy(arr2, arr1, num); //将arr1的前三个字符拷贝到arr2中printf("%s", arr2);  //结果为abcreturn 0;
}

5.3模拟实现📘

和strcpy的模拟实现类似,只不过要加一条对n的判断以确保只拷贝前n个字符

#include<stdio.h>
#include<assert.h>char* my_strncpy(char* des, const char* src, size_t n)
{assert(des && src);char* ret = des;while (*des++ = *src++){n--;if (n == 0)  {return ret;}}
}int main()
{char arr1[] = "abcedf";char arr2[20] = { 0 };size_t num = 3;char* r = my_strncpy(arr2, arr1, num);printf("%s", r);return 0;
}

6.strncat📚

6.1函数用法📗

strncat函数原型:

用法:和strncat函数用法相同,但它是将数组的前num个字符追加到目标数组的'\0'处

6.2具体实现📕

#include<stdio.h>
#include<string.h>int main()
{char arr1[20] = "abc\0xxx";char arr2[] = "defghi";size_t num = 3;strncat(arr1, arr2, num); //加完后会自动将\0加上printf("%s", arr1);return 0;
}

在arr1的'\0'处将def加上后会自动加一个'\0'以构成一个完整的字符串

6.2模拟实现📘

和strcat的模拟实现类似,只不过要加一条对n的判断以确保只追加前n个字符

#include<stdio.h>
#include<assert.h>char* my_strncat(char* des, const char* src, size_t n)
{char* ret = des;while (*des != '\0'){des++;}while (*des++ = *src++){n--;if (n == 0){*des = '\0';return ret;}}
}int main()
{char arr1[20] = "abc";char arr2[] = "defghi";size_t num = 3;char* ret = my_strncat(arr1, arr2, num);printf("%s", ret);return 0;
}

7.strncmp📚

7.1函数用法📗

strncmp函数原型:

用法:和strcmp用法相同,但它只比较两个字符串前num个字符

7.1具体实现📕

#include<stdio.h>
#include<string.h>int main()
{char arr1[] = "abcdef";char arr2[] = "abcdzz";size_t num = 0;int cmp = strncmp(arr1, arr2, num);if (cmp > 0){printf(">");}else{printf("<=");}return 0;
}

7.3模拟实现📘

#include<stdio.h>
#include<assert.h>int my_strncmp(const char* str1, const char* str2, size_t n)
{assert(str1 && str2);while (*str1 == *str2){n--;if (n == 0){return 0; //当前n个字符相同,返回0}}return *str1 - *str2; //出现字符不相同时,跳出上面循环,返回*str1 - *str2
//前者大,返回大于0的值,后者大,返回小于0的值}int main()
{char arr1[] = "abcdef";char arr2[] = "abcdzz";size_t num = 3;int cmp = my_strncmp(arr1, arr2, num);if (cmp > 0){printf(">");}else{printf("<=");}return 0;
}

🙉以上为7个字符串库函数的讲解,后续会对剩余的字符串库函数和内存函数进行讲解

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

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

相关文章

Harmony Codelab 样例—弹窗基本使用

一、介绍 本篇 Codelab 主要基于 dialog 和 button 组件&#xff0c;实现弹窗的几种自定义效果&#xff0c;具体效果有&#xff1a; 1. 警告弹窗&#xff0c;点击确认按钮弹窗关闭。 2. 确认弹窗&#xff0c;点击取消按钮或确认按钮&#xff0c;触发对应操作。 3. 加载…

Java基于SpringBoot的在线考试系统的研究与实现(附源码,教程)

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝30W,Csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 文章目录 第一章第二章.主要技术第三章第四章 系统设计4.1功能结构4.2 数据库设计4.2.1 数据库E/R图4.2.2 数…

数据变换:数据挖掘的准备工作之一

⭐️⭐️⭐️⭐️⭐️欢迎来到我的博客⭐️⭐️⭐️⭐️⭐️ &#x1f434;作者&#xff1a;秋无之地 &#x1f434;简介&#xff1a;CSDN爬虫、后端、大数据领域创作者。目前从事python爬虫、后端和大数据等相关工作&#xff0c;主要擅长领域有&#xff1a;爬虫、后端、大数据…

《Python趣味工具》——自制emoji3

今日目标 在上次&#xff0c;我们绘制了静态的emoji图。并且总结了turtle中的常用函数。 本次我们将尝试制作一个动态的emoji&#xff0c;让你的表情包动起来&#xff01; 文章目录 一、动画原理&#xff1a;二、制作动画&#xff1a;1. 修改eyes_black()函数&#xff1a;2. 绘…

软考和PMP哪个含金量更高?

软考中&#xff0c;能和pmp一起来比较的是软考高项&#xff0c;软考高级信息系统项目管理师&#xff0c;和PMP的共同点&#xff0c;基本来说都是项目管理类的证书。本质也都是适用于项目经理岗位的证书&#xff0c;软考高项中大部分考试内容是PMPIT技术两部分&#xff0c;其中项…

【STL容器】list

文章目录 一、list定义二、list的迭代器三、list的元素操作四&#xff0c;list的优缺点 一、list定义 list本质是一个双向带头循环链表 template<class T> struct list_node {list_node* prev;T val;list_node* next; };template<class T> class list {typedef lis…

如何打造可视化警务巡防通信解决方案

近年来&#xff0c;科学技术飞速发展&#xff0c;给予了犯罪分子可乘之机。当面临专业化的犯罪分子、高科技的犯罪手段&#xff0c;传统警务模式似乎不能满足警方打击犯罪的需要&#xff0c;因此当今公安工作迫切需要构建智能化、系统化、信息化的警务通信管理模式。 警务人员…

python 第一次作业

1.使用turtle换一个五环 2.设计这样一个程序&#xff1a;输入一个数字 判断它是不是一个质数 使用turtle换一个五环&#xff1a; >>> import turtle #导入模块 >>> turtle.width(10) #设置圆圈宽度 >>> turtle.color("blue&qu…

JDK10特性

文章目录 JAVA10概述语法层次的变化局部变量的类型推断不能使用类型推断的场景变量的声明初始值nulllambda表达式方法引用为数组静态初始化成员变量不能使用其他不可以的场景 API层次的变化集合的copyOf方法 总结 JAVA10概述 2018年3月21日&#xff0c;Oracle官方宣布JAVA10正…

HTML整站规划与规范

文章目录 命名规则命名命名书写 包含样式规范样式重置样式引入页面结构页面宽度页面高度与背景页面设计 网址图标 命名规则 命名 根据每块元素的主题、功能、页面上的位置命名&#xff0c;便于后期更改与维护。 另外&#xff1a;如果所有样式放在同一文件下&#xff0c;可以给…

BUUCTF:[GYCTF2020]FlaskApp

Flask的网站&#xff0c;这里的功能是Base64编码解码&#xff0c;并输出 并且是存在SSTI的 /hint 提示PIN码 既然提示PIN&#xff0c;那应该是开启了Debug模式的&#xff0c;解密栏那里随便输入点什么报错看看&#xff0c;直接报错了&#xff0c;并且该Flask开启了Debug模式&am…

qt自定义可删除标签控件、自适应布局

自定义标签&#xff0c;支持删除、设置/获取数据、自适应布局操作。 如图&#xff0c;可点击删除按钮操作、拖拽窗口自适应&#xff1b; 代码参考

21天学会C++:Day11----运算符重载

CSDN的uu们&#xff0c;大家好。这里是C入门的第十一讲。 座右铭&#xff1a;前路坎坷&#xff0c;披荆斩棘&#xff0c;扶摇直上。 博客主页&#xff1a; 姬如祎 收录专栏&#xff1a;C专题 目录 1. 知识引入 2. 运算符重载 2.1 operator<() 2.2 operator() 2.3 o…

Vue的详细教程--基础语法【上】

&#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 接下来看看由辉辉所写的关于Vue的相关操作吧 一.插值 1.文本 <!DOCTYPE html> <html><head><meta charset"utf-8"><title>插值</title>&l…

python爬虫爬取电影数据并做可视化

思路&#xff1a; 1、发送请求&#xff0c;解析html里面的数据 2、保存到csv文件 3、数据处理 4、数据可视化 需要用到的库&#xff1a; import requests,csv #请求库和保存库 import pandas as pd #读取csv文件以及操作数据 from lxml import etree #解析html库 from …

element 搜索框静态查询

效果图 代码块 <template><div><!-- 1.产品搜索 --><div class"header"><div class"from"><el-form :inline"true" :model"formInline" class"demo-form-inline"><el-form-item l…

Vue复选框批量删除示例

Vue复选框批量删除 通过使用v-model指令绑定单个复选框 例如<input type"checkbox" id"checkbox" v-model"checked"> 而本次我们要做的示例大致是这样的&#xff0c;首先可以增加内容&#xff0c;然后通过勾选来进行单独或者批量删除&…

[计算机入门] 电源选项设置

3.10 电源选项设置 有时候我们的电脑一段时间没有用&#xff0c;会自己关掉屏幕或者直接睡眠&#xff0c;这是电源选项没有设置好导致的。 1、打开控制面板&#xff0c;打开其中的电源选项 2、点击左侧上方的选择关闭显示器的时间 3、进入到编辑计划设置界面&#xff0c;在…

【Vue】MVVM模型还没懂嘛

hello&#xff0c;我是小索奇&#xff0c;精心制作的Vue教程持续更新哈&#xff0c;想要学习&巩固&避坑就一起学习叭~ MVVM 模型 Vue虽然没有完全遵循MVVM模型&#xff0c;但Vue的设计也收到了它的启发在文档中也会使用VM&#xff08;ViewModel的缩写&#xff09;这个变…

安防电源芯片有哪些-42v转5v芯片

安防电源芯片有多种种类和型号&#xff0c;以下是一些常见的安防电源芯片&#xff1a; 1. 电源管理芯片&#xff08;Power Management IC&#xff0c;PMIC&#xff09;&#xff1a;这些芯片用于管理和控制安防系统的电源供应&#xff0c;包括电压调整、电流控制、电池管理等功…