【C语言】字符串函数strcpy&&strcat&&strcmp&&strstr的使⽤和模拟实现1:https://developer.aliyun.com/article/1474749
运行代码图:
🌠strcmp 的使⽤
strcmp
用于比较两个字符串是否相等,也就是比较字符串大小的函数。
函数原型:
int strcmp(const char *str1, const char *str2); str1和str2是要比较的两个字符串指针。
strcmp
比较字符串的大小,不是按字符串的长度进行比较,而是逐个字符地比较两个字符串对应的每个字符的ASCII
码值。(比较使用的是无符号字符值的ASCII码顺序。)
- 返回值:
- 如果str1和str2完全相等,返回0。
如果str1大于str2(按ASCII码顺序),返回一个大于0的数。
如果str1小于str2,返回一个小于0的数。
strcmp()函数是C标准库string.h头文件中的函数。
字符串比较结束条件是遇到字符串末尾'\0'字符或者第一个不匹配
- 字符。
字符串"cat" 和 "dog" 的比较: 'c'的ASCII码是99, 'd'的ASCII码是100,所以"cat"小于"dog" 字符串"hello" 和 "hello world" 的比较: 前6个字符都相等,但第7个字符' '的ASCII码小于'\0',所以"hello"小于"hello world"
例子:
#include <string.h> int main() { char str1[] = "ahbyb"; char str2[] = "asyzx"; int result = strcmp(str1, str2); if(result == 0) printf("Strings are equal\n"); else if(result > 0) printf("str1 is greater than str2\n"); else printf("str1 is less than str2\n"); return 0; }
结果:
str1 is less than str2 • 1
🌉strcmp 模拟实现
int my_strcmp(const char* s1, const char* s2) { while (*s1 == *s2) { if (*s1 == '\0') return 0; s1++; s2++; } return *s1 - *s2; //if (*s1 > *s2) // return 1; //else // return -1; }
使用while
循环逐个比较s1
和s2
每个字符是否相等如果字符相等,继续循环比较下一个字符, 如果遇到字符串结束符’\0’,表示两个字符串完全匹配,直接返回0
,如果在循环中找到不匹配的字符,使用*s1 - *s2
返回两个字符的ASCII
码差值
🌠 strstr 的使⽤
strstr
用来查找一个字符串在另一个字符串中首次出现的位置。
strstr函数的原型:
char* strstr(const char* str1, const char* str2); - str1: 主字符串,要在其中查找子字符串 - str2: 子字符串,要查找的字符串
strstr
函数可以用来在一个字符串中查找另一个字符串首次出现的位置,如果str2
不存在于str1
中,则返回NULL
;如果str2
存在于str1
中,则返回第一个匹配位置的指针。
strstr的比较原理是:
- 从
str1
字符串的起始位置开始,与str2
字符串进行字符匹配比较。 - 如果匹配失败(当前字符不同),则
str1
指针后移一位,继续匹配。 - 如果匹配成功(到达
str2
字符串结束符'\0'
),则匹配成功,返回str1
指针地址。 - 如果遍历完
str1
仍未匹配成功,则返回NULL
。
例如:
char* p = strstr("hello world","world"); // p指向"world"子字符串在"hello world"中的位置
这里用一个图来解释strstr函数的工作原理:
+----------------------+ str1 => | h e l l o w o r l d| +----------------------+ | V +-----------+ str2 => | w o r l d | +-----------+ | V 比较第一个字符'h'与'w',不匹配 | V 指针后移到下一个字符'e' | V 比较'e'与'w',不匹配 | V 指针后移到下一个字符'l' | V 比较'l'与'w',不匹配 | V 指针后移,依次比较直到匹配成功 | V 当str1指针指向'w'时,与str2第一个字符'w'匹配 | V 开始匹配后续字符,全部匹配成功 | V 返回str1指针地址,指向子字符串在主字符串中的位置
结果:
cegtbaab • 1
当然也可以用图展示:
strstr
从str1
起始位置开始,用str2
与str1
进行字符匹配比较。如果不匹配就后移str1
指针,匹配成功就返回str1
当前位置指针,上图就是返回c
的地址。通过这种逐个匹配的方式找到子字符串在主字符串中的第一个匹配位置。
🌉strstr 的模拟实现
char* my_strstr(const char* str1, const char* str2) { const char* cur = str1;//用cur记录str1的位置 const char* s1 = NULL;//使用assert检查str1和str2是否为非空指针。 const char* s2 = NULL; assert(str1 && str2); if (*str2 == '\0')//检查str2是否为空字符串,如果为空直接返回str1。 { return (char*)str1; } while (*cur)//使用cur指针遍历str1。 { //每次遍历: s1 = cur;//将cur赋值给s1,将str2赋值给s2,用于后续匹配 s2 = str2;//当然,第几次失败后,重新回溯,重新开始匹配 while (*s1 && *s2 && *s1 == *s2) { s1++;//开始匹配s1和s2中的字符,同时递增s1和s2。 s2++; } if (*s2 == '\0')如果s1和s2匹配到结尾('\0'),表示找到了子串,返回cur。 { return (char*)cur; } cur++;匹配失败后,cur++继续下次匹配。 } return NULL;遍历完str1没有找到匹配,返回NULL。 }
时间复杂度为O(MN)
,其中M和N分别为主串和子串的长度。
若老铁们有点蒙蒙的,可以结合下图来理解:
🚩总结
这次阿森和你一起学习4个C语言中常用的基本字符操作函数,当然这只是一部分,还有很多,但阿森会慢慢和你一起学习。感谢你的收看,如果文章有错误,可以指出,我不胜感激,让我们一起学习交流,如果文章可以给你一个小小帮助,可以给博主点一个小小的赞😘