一. strcmp
初学这个函数的时候可能有误区,以为比较的是字符串长度,实则不然,strcmp比较的是字符的ascii码值,在vs编译器中,第一个字符大于第二个字符,就>0;小于第二个字符,就<0;
第一个字符等于第二个字符,就=0,相等就比较下一个字符,依此递推。
int strcmp( const char *string1, const char *string2 );
1.参数说明
string1和string2为两个要比较的字符串,返回一个int值。
2.代码实现
int my_strcmp(const char* str1, const char* str2) { assert(str1&&str2);//断言,NULL指针直接失败 while (*str1 == *str2) { if (*str1 == '\0') { return 0; } str1++; str2++; } /*if (*str1 > *str2) return 1; else return -1;*/ //简化 return (*str1 - *str2); } int main() { const char* str1 = "abcdef"; const char* str2 = "aqwer"; //利用库函数int ret = strcmp(str1, str2);//实际比的不是长度,而是比的字符ascii码值 int ret=my_strcmp(str1,str2); //a=s,那么往后比较 printf("%d\n", ret);//linux -gcc操作系统中当是>0 返回>0;当时=0,返回0;当是<0,返回<0 //判断要>,=,<0 return 0; }
二.strncmp
1.指定前n个字符进行比较,不受'\0'的限制,需要输入三个参数,
int strncmp( const char *string1, const char *string2, size_t count );
string1和string2两个要比较的字符串和要比较count个字符。
#include<stdio.h> #include<string.h> #include<assert.h> int my_strncmp(char* str1, char* str2, size_t count) { assert(str1 && str2);//断言 while (*str1 == *str2 && count)//简化语句 { if (*str1 == '\0') { return 0; } str1++; str2++; count--; } if (count == 0)//此处说明已经前几个相同了。 { return 0; } if (*str1 > *str2) return 1; else if (*str1 < *str2) return -1; else return 0; } int main() { char str1[] = "abddd"; char str2[] = "abd"; int ret =my_strncmp(str1, str2, 4); printf("%d\n", ret); return 0; }
三.strcpy
1.字符串拷贝
char *strcpy( char *strDestination, const char *strSource );
把一个字符串拷贝到另一个字符串,结束以'\0'为标识。需要注意的是目的地空间应该大于起始。
2.代码实现
char* my_strcpy(char* dest, const char* sry) { assert(dest && sry); char* start = dest;//返回起始位置 while (*sry != '\0') { *dest = *sry; dest++; sry++; } if (*sry == '\0') *dest = '\0'; return start; } int main() { char arr1[] = "bit"; char arr2[] = "hello world"; my_strcpy(arr2, arr1); printf("%s\n", arr2); return 0; }
四.strncpy
1.拷贝num个字符从源字符串到目标空间,不过在笔者看来,这个库函数并不能让人满意,主要是因为看图::
相信大家可以看到,我只想拷贝bitb到arr2,而这是因为库函数没有进行追加'\0'.笔者自我实现一个函数,(说不定是笔者浅薄,无法理解库函数深意),实现只要num个字符拷贝。
2.代码实现
#include<stdio.h> #include<assert.h> char* my_strncpy(char* dest, const char* sry, int count) { assert(dest && sry); char* start = dest; while (count&&(*dest++=*sry++))//凝炼成这么一个短句真是精妙 { count--; } if (count!='\0') { while (--count)//因为是先执行上个while条件句再判断,故count在上个while语句未减1,而执行了*dest++=*sry++,所以应该前置-- { *dest++ = '\0'; } } else *dest='\0';//加上这么一句话就可以弥补库函数的瑕疵 return start; } int main() { char arr1[] = "bit"; char arr2[] = "abcedfg"; my_strncpy(arr2, arr1, 5);//需要注意目的地数组的空间应该大于等于要拷贝的长度 printf("%s\n", arr2); return 0; }
五.strncat--字符串追加
1.在dest末尾追加num个字符,注意目的地空间要够大,追加最后在后面补个'\0'.
char *strncat( char *strDest, const char *strSource, size_t count );
2.代码实现
#include<stdio.h> #include<assert.h> char* my_strncat(char* dest, const char* sry, int count) { assert(dest && sry); char* start = dest; while (*dest != '\0') { dest++; }//直接到代码末尾 while (count&&(*dest++=*sry++)) { count--; } if (count)//说明sry已经到'\0' { while (--count != 0)\\这个前置--挺好玩 { *dest++ = '\0'; } } else *++dest = '\0'; return start; } int main() { char arr1[30] = "hello"; char arr2[] = "world";//时候会在后面补个'\0',如果追加的个数长于源字符串,那么就打印源字符串 my_strncat(arr1, arr2, 2);//追加的 printf("%s\n", arr1); return 0; }
六.strstr--字符串查找
1.函数
1、strstr() 函数搜索一个字符串在另一个字符串中的第一次出现。
2、找到所搜索的字符串,则该函数返回第一次匹配的字符串的地址;
3、如果未找到所搜索的字符串,则返回NULL。
char *strstr(const char *dest, const char *sry);
dest: 被查找目标
sry: 要查找对象.
2.函数实现
char* my_strstr(const char* dest, const char* sry) { assert(dest && sry); const char* dest1 = dest; const char* sry1= sry; const char* tmp = dest;//设两个dest的替换,一个用于判断,一个用于跳出循环 while (*tmp) { dest1 = tmp; sry1 = sry;//如果不等,那么再次循环时dest1要往后查找,所以要赋tmp,而sry1则还是在首地址 while (*dest1 && *sry1 && (*dest1 == *sry1)) { *dest1++; *sry1++; } if (*sry1 == '\0') { return (char*)tmp;//找到子串并返回要第一次匹配字符串的地址 } if (*dest1 == '\0')//一直到查完dest都没找到 { return NULL; } tmp++; } } int main() { const char*str1="bbc"; const char*str2="bcbbcdef"; char* ret =my_strstr(str2,str1); if (ret == NULL) { printf("子串不存在\n"); } else printf("找到子串:%s\n", ret); return 0; }
以上是笔者初学C的一些字符串库函数实现的代码。有几个是笔者自己敲构造的,在编译过程中没有出现问题。如果有问题,劳烦各位大佬指教啊。🌹