strstr函数部分
char *strstr( const char * string , const char * strCharSet )
Each of these functions returns a pointer to the first occurrence of strCharSet in string, or NULL if strCharSet does not appear in string. If strCharSet points to a string of zero length, the function returns string.
Each of these functions returns a pointer to the first occurrence of strCharSet in string, or NULL if strCharSet does not appear in string. If strCharSet points to a string of zero length, the function returns string.
函数返回一个指针,指向字符串中第一次出现的地址,如果该地址未出现在字符串中,则返回 NULL。如果该地址指向长度为零的字符串,则该函数返回字符串。
简单例子:
#define _CRT_SECURE_NO_WARNINGS #include <string.h> #include <stdio.h> #include<assert.h> char * my_strstr(char* a, char* b) { assert(a && b); char* s1 = NULL; char* s2 = NULL; char* cp = a; while (*cp) { s1 = cp; s2 = b; while (*a++ == *b++) { ; } if (*b == '\0') { return cp; } cp++; } return NULL; } int main() { char a[10] = "bcdef"; char b[10] = "cde"; if (my_strstr(a, b) == NULL) { printf("找不到"); } else { printf("找到了,地址是%p", my_strstr(a, b)); } return 0; }
分析
假设有两个字符串,指针str1, str2分别指向字符串首字母。
要在str1中查找str2并打印出来,先判断str1和str2指向的字符是否相等,此时有两种情况:第一种情况指向的字符不相等,str1要指向下一个字符,再判断,如此循环往复,当str1指向的是 '\0' 时,可以判断出str1中不存在str2,此时返回NULL;
第二种情况下指向的字符相等,那么不仅str1要向后读取字符,str2也要向后读取字符,再判断是否相等。
在向后读取字符的过程中,仍有两种情况:1.str1和str2指向的字符一直相等,直到str2指向'\0',这时可以知道str1中存在str2字符串,返回的是str1中的str2字串的第一个字符地址;
2.str1和str2指向的字符不全相等,例如下图中,*(str1+1) == *str2,*(str1+2) == *(str2+1),*(str1+3) != *(str2+2),此时指针str2就要返回到字符串str2首字符的地址,而指针str1需要返回到第一次和str2指向的字符相等的后一个位置,即字符串str1中第二个 'b' 的地址。然后又回到一开始的判断。
strcmp部分
strcmp函数是专门用来字符串之间的的比较的
这个比较是比较两个字符串是否相同,如果不相同那就比较两个字符串的长度大小。
int strcmp( const char *string1, const char *string2 );
strcmp函数的参数是两个字符串,返回值为整形
当如果字符串1与字符串2相等则返回值为0。
如果字符串不一样,并且字符串1>字符串2,则返回值>0。
反之返回值小于零。
strcmp函数比较的是两个字符串不相等的第一个字符的ASCII值。
如果有一方是\0,则非零的字符串较大。
模拟实现strcmp函数
我给出以下两种方法:
#define _CRT_SECURE_NO_WARNINGS #include <string.h> #include <stdio.h> #include<assert.h> int my_strcmp(char* a, char* b) { assert(a && b); while (*a == *b) { if (*a == '\0') { return 0; } a++; b++; } return *a - *b; } int main() { char a[10]="abcdef"; char b[10]="abc"; if (my_strcmp(a,b) > 0) { printf("a>b"); } if (my_strcmp(a, b) == 0) { printf("a==b"); } if(my_strcmp(a,b)==0) { printf("a<b"); } return 0; }
int my_strcmp (const char * src, const char * dst) { int ret = 0 ; assert(src != NULL); assert(dest != NULL); while( ! (ret = *(unsigned char *)src - *(unsigned char *)dst) && *dst) ++src, ++dst; if ( ret < 0 ) ret = -1 ; else if ( ret > 0 ) ret = 1 ; return( ret ); }
长度受限制的字符串函数
strncpy
char *strncpy( char *strDest, const char *strSource, size_t count );
复制字符串src中的内容到字符串dest中,复制多少由size_t参数的值决定。
如果src的前n个字符不含NULL字符,则结果不会以NULL字符结束。
如果n<src的长度,只是将src的前n个字符复制到dest的前n个字符,不自动添加'\0',结果dest不包括'\0',需要我们再手动添加一个'\0'。
如果src的长度小于n个字节,则以NULL填充dest直到复制完n个字节。src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符长度+'\0'。
简单例子
#define _CRT_SECURE_NO_WARNINGS #include <string.h> #include <stdio.h> int main() { char a[10]="******"; char b[10]="chenda"; strncpy(a, b, 2); printf("%s", a); return 0; }
strncat
char *strncat( char *strDest, const char *strSource, size_t count );
#define _CRT_SECURE_NO_WARNINGS #include <string.h> #include <stdio.h> int main() { char a[15]="hello \0 ******"; char b[15]="world"; strncat(a, b, 6); printf("%s", a); return 0; }
如图所示 :
调试过程如图所示。
我们可以看到,strncat会自动添加\0,且到\0为止,不会再去将其它字符化为\0。
strncmp
int strncmp ( const char * str1 , const char * str2 , size_t num );
比较到出现另个字符不一样或者一个字符串结束或者num个字符全部比较完为止。
返回值判断方法和strcmp基本相等。
简单例子
#include <string.h> #include <stdio.h> int main() { char a[20]="hello world"; char b[15]="hello"; if (strncmp(a, b, 4) == 0) { printf("相等"); } else printf("不相等"); return 0; }
前五个字符相等。
👉 本菜鸡&总结 👈
这篇博客旨在总结我自己阶段性的学习,要是能帮助到大家,那可真是三生有幸!😀如果觉得我写的不错的话还请点个赞和关注哦~我会持续输出编程的知识的!🌞🌞🌞