[C语言]string.h常用字符串库函数详解+模拟实现

您所在的位置:网站首页 strrpl库函数 [C语言]string.h常用字符串库函数详解+模拟实现

[C语言]string.h常用字符串库函数详解+模拟实现

2024-07-13 10:48| 来源: 网络整理| 查看: 265

目录

字符串函数

strlen

strcpy

strcat

strcmp

strstr

内存函数

memcpy

memmove

人生百态,苦事之多。烦恼穿心,何来解脱?打开博客,吸取干货。

以码消愁,以串解忧。泱泱年轮,唯有生活。一起撸串,快乐几何。

字符串函数 strlen

在C语言中,我们通过字符数组的方式来存储字符串,也可以直接使用常量字符串,如何去判断字符串的长度便是一个问题。比如char ch[100] = "abcdef";  难道长度就是100吗?显然不对,我只有abcdef这六个字母,长度应该为6才对,所谓上天有好生之德,留下了一个库函数strlen可以求得字符串的长度。

#include #include int main() { char ch[100] = "abcdef"; int len = strlen(ch); printf("%d\n", len);//结果为6 len = strlen("abcdef") printf("%d\n", len);//结果依然为6 return 0; }

strlen使用起来竟如此方便,只需把数组名或常量字符串往里一掷,它便会自己返回字符串长度。

如何模拟实现计算字符串长度?我们需要知道,C语言是如何打印字符串的。

char ch[] = "abcdef"; printf("%s\n", "abcdef"); printf("%s\n", ch);

放一个字符串以%s打印显然没问题,但是放一个数组名用%s打印也没问题,而数组名是什么?数组名是数组首元素地址(除开sizeof和&的特殊情况)那是否常量字符串也是首元素地址?

printf("%p\n", "abcdef");

由此可以得知,其实C语言打印字符串是根据它的首元素地址一直往下找,找到一个打印一个,那么何时停止?根据我们扎实的C语言基础知识,我们都知道字符串以\0结尾,所以找到\0的时候便不用再打印了。

知道了原理,接下来就是模拟实现了。既然字符串是根据地址找的,我们就传入首地址,既然是以\0结尾的,我们就把\0之前的字符全部统计一遍,这样就能得到字符串长度了。

int my_strlen(const char* str)//因为只需要统计个数 不需要改变字符 所以用const { assert(str); //防止传NULL指针 引用头文件assert.h进行断言 int len = 0; while(*str != '\0') { str++; len++; } return len; } strcpy

strcpy函数用于把一个字符串拷贝到另一个字符串中。但要在使用的时候注意一些事项:

1. 目标空间必须足够大   2. 源空间必须存在\0   3.目标空间必须可以更改

char ch[100];//目标空间可更改 且足够大 char cpy[] = "abcdef";//源空间存在\0 strcpy(ch, cpy);//将cpy的内容拷贝到ch中 printf("%s\n", ch);

既然我们知道字符串以\0结尾,那我们只需要知道他们两个字符串的首元素地址,然后到被拷贝字符串的\0为止全部拷贝进去即可。

模拟实现:

char* my_strcpy(char* dest, const char* src) { assert(dest && src);//断言 char* ret = dest;//用于返回给用户拷贝完后的地址 方便用户操作 while(*dest++ = *src++);//当src不为\0时拷贝到dest中 并后移一位 return ret; } strcat

strcat(str1, str2);会把str2的内容追加到str1后面。​但也有一些注意事项:

1.目标空间必须足够大   2.目标空间必须存在\0   3.源空间必须存在\0  4.目标空间必须可更改

char ch1[100] = "I love";//目标空间足够大且存在\0且可更改 char ch2[] = " You";//源空间存在\0 strcat(ch1, ch2); printf("%s\n", ch1);

模拟实现:(找到目标空间\0之后和strcpy实现方式类似)

char* my_strcat(char* dest, const char* src) { assert(dest && src); char* ret = dest; while(*dest) { dest++; } while(*dest++ = *src++); return ret; } strcmp

当我们需要比较两个字符串是否一致时,许多小白都会直接用 == 进行比较,但我们之前提到过,字符串本质上是首元素地址, ==进行比较时比较的也是首元素的地址,所以答案会与我们的期待的不符,实际上C语言有一个库函数strcmp可以比较两个字符串,相等返回0,不相等时返回值根据第一个不等的字符词典序进行返回(大于返回>0 小于返回



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3