🚀前言
今天阿辉将为大家介绍字符串库函数strlen
、strcpy
、strcmp
、strstr
、strcat
的使用以及模拟实现,关注阿辉不迷路哦 😘 ,内容干货满满😋,接下来就跟着阿辉一起学习吧👊
🚀库函数strlen
库函数strlen
是专门求字符串长度的库函数,strlen
只能求字符串长度且要求字符串末尾须有\0
,返回值长度不包括\0
strlen
的函数声明
size_t strlen(const char* src); 返回值为size_t类型 接受一个字符串的首元素地址,即可返回字符串长度
例子:
#include<stdio.h> #include<string.h> int main() { char* a = "abcdef";`//末尾有\0 char c[] = { 'a','b','c','d','e','f' };//末尾无\0 printf("%zd\n", strlen(a)); printf("%zd\n", strlen(c)); return 0; }
输出:
上图我们可以看到一个输出6
而一个却是42
,就是因为常量字符串a
末尾有\0
而字符串数组c
末尾无\0
,而库函数strlen
计算的长度是从字符串首元素到\0
之间的元素个数,若字符串末尾无\0
,strlen
则会一直向后找到\0
位置然后返回。在C语言中\0
堪称字符串的灵魂,后面几个函数会让大家有更深的体会。
✈️strlen的模拟实现
铁子们,咱们直接代码以及详解奉上👇
size_t my_strlen(const char* src) { assert(src != NULL);//断言判断传入指针不为空 size_t ret = 0;//记录字符串长度,作为返回值 while (*src++)//这句代码下面单独解释 { ret++; } return ret; }
关于
while(*src++)
这句代码,因为后置++
的优先级更高所以src++
,但是又因为后置++
实现使用后++
,所以*src++
这个表达式的值是*src
然后src
再加1
,然后当指针src
偏移到\0
位置时while
循环就停止了因为\0
的本质就是0
🚀库函数strcpy
库函数strcpy
是用来用来拷贝字符串的
strcpy
的函数声明:
char* strcpy(char* dest, const char* src); 把从src地址开始到\0的字符串复制到以dest开始的地址空间 返回值为拷贝位置起始地址
注意:
- 将源指向的 C 字符串复制到目标指向的数组中,包括终止空字符(并在该点停止)
- 源字符串必须以 ‘\0’ 结束。
- 会将源字符串中的 ‘\0’ 拷贝到目标空间。
- 目标空间必须足够大,以确保能存放源字符串。
- 目标空间必须可变
例子:
int main() { char a[] = "abcd"; char b[10] = { 0 }; strcpy(b, a); printf("%s",b); return 0; }
输出:
abcd
✈️strcpy的模拟实现
char* my_strcpy(char* dest, const char* src) { char* ret = dest;//记下目标位置起始地址 assert(dest && src);//断言判断传入的指针不为空 while (*dest++ = *src++) { ; } return ret;//返回目标位置起始地址 }
*dest++ = *src++这段代码可以理解为先进行*dest = *src,然后dest = dest + 1; src = src + 1,当src
指向\0
时,\0
赋给*dest
然后跳出循环
🚀strcmp
库函数strcmp
的函数声明:
int strcmp(const char* str1, const char* str2);
strcmp
是用来比较字符串大小的函数,但并非是以字符串长度比较的,而是从两个字符串的起始位置开始,一一对应地进行比较,如果它们彼此相等,则继续以下对,直到字符不同或达到\0
,字符不同时比较的是ASII值大小
返回值:
- 第一个字符串大于第二个字符串,则返回大于0的数字
- 第一个字符串等于第二个字符串,则返回0
- 第一个字符串小于第二个字符串,则返回小于0的数字
例子:
int main() { char a[] = "adc"; char b[] = "abcd"; int ret = strcmp(a, b); printf("%d ", ret); return 0; }
输出:
1
✈️strcmp的模拟实现
int my_strcmp(const char* str1, const char* str2) { assert(str1 && str2); while (*str1 == *str2) { if (*str1 == '\0')//两字符串相等,同时指向字符串末尾的\0 return 0; str1++; str2++; } return *str1 - *str2;//不等位置相减 }
🚀strstr
库函数strstr
的函数声明:
char* strstr(const char* str1, const char* str2);
strstr
函数是用来判断主串str1
中是否存在子串str2
,如果存在则返回str1
中第一次出现子串的起始位置地址,否则返回NULL
阿辉作图给大家展示一下:
int main() { char a[] = "abcdsfejsl"; char b[] = "dsfe"; printf("%s", strstr(a, b)); return 0; }
输出:
dsfejsl
因为返回的是主串中子串起始位置地址,上述代码中也就是d
位置的地址,用%s
打印就是dsfejsl
这一段
✈️strstr的模拟实现
char* my_strstr(const char* dest, const char* src) { assert(dest && src);//断言判断不为空 char* ret = dest;//ret作返回值,记录主串下一个起始比对位置 char* p = src;//记录子串的起始位置 if (*src == '\0')//子串为空直接返回主串 { return ret; } while (*dest)//遍历到主串\0位置跳出循环 { //从主串起始比对位置与子串一一比对 while (*dest++ == *src++)//不相等时跳出循环 { if (*dest == '\0')//当主串遍历到\0位置还进来,说明子串也到末尾\0位置了,直接返回主串起始比对位置 { return ret; } } if (*src == '\0')//跳出循环时,src已到\0位置说明主串中找到子串,返回主串起始比对位置 { return ret; } dest = ++ret;//上述if都没进去说明该主串起始比对位置找不到子串,++ret记录下一个起始比对位置,并把值赋给dest,从下一个起始比对位置开始遍历 src = p;//src返回子串起始位置 } return NULL;//上述都为返回说明找不到,返回空 }
铁子们不懂的话,下面这幅图还有解释:
🚀strcat
库函数strcat
的函数声明:
char* strcat(char* dest, const char* src);
strcat
库函数是用来把src所指向的字符串(包括\0
)复制到dest所指向的字符串后面(删除*dest
原来末尾的\0
)。要保证*dest
足够长,以容纳被复制进来的*src
。*src
中原有的字符不变。返回指向dest
的指针
例子:
int main() { char a[20] = "abc"; char b[] = "dsfe"; printf("%s\n", strcat(a, b)); return 0; }
输出:
abcdsfe
✈️strcat的模拟实现
char* my_strcat(char* dest, const char* src) { assert(dest && src);//断言判断不为空 char* ret = dest;//记录起始地址作为返回值 while (*dest)//找到目标字符串\0位置 { dest++; } while (*dest++ = *src++) { ; } return ret; }
while (*dest++ = *src++)
这段代码前面大家见得多了,实在不理解可以自己敲出来试试,这里阿辉复制粘贴一下😘
*dest++ = *src++这段代码可以理解为先进行*dest = *src,然后dest = dest + 1; src = src + 1,当src
指向\0
时,\0
赋给*dest
然后跳出循环
到这里,阿辉今天对于C语言中部分字符函数的分享就结束了,希望这篇博客能让大家有所收获, 如果觉得阿辉写得不错的话,记得给个赞呗,铁子们的支持是我创作的最大动力🌹