@TOC
前言
一.strlen函数
1.用法
计算字符串长度
但应注意 使用 string.h头文件
strlen函数返回值为 unsigned int
#include<stdio.h> #include<string.h> int main() { if(strlen("abc")-strlen("abcdef")>0) { printf(">\n"); } else { printf("<"\n); } return 0; }
如果我们正常来看 strlen("abc" )---- 3 strlen("abcdef')----6
3-6应为 -3 但是-3为无符号数 所以应该输出-3的补码
即一个很大的数 为 >
## 2.模拟实现strlen函数
#include<stdio.h> #include<assert.h> int mystrlen(const char*str)//const 在*左边代表指针指向的内容不能被改变 ,指针本身可以改变 { assert(str!=NULL); int sum=0; while(*str!='\0') { sum++; str++; } return sum; } int main() { char arr[]="hello"; int ret=mystrlen(arr); printf("%d\n",ret);//5 return 0; }
二.strcpy函数
1.用法
拷贝函数
将arr2拷贝到arr1中
使用头文件
但是必须保证arr1能够放下arr2
需要注意的是 拷贝时 将'\0'也会拷贝过去
#include<stdio.h> #include<string.h> int main() { char arr1[20]="XXXXXXXX"; char arr2[]="hello"; strcpy(arr1,arr2); printf("%s\n",arr1);//hello return 0; }
2.模拟实现strcpy函数
#include<stdio.h> #inlcude<assert.h> char* mystrcpy(char*dest,const char*src)//这里的src为要传递arr2,不能改变src指针本身 { asser(src!=NULL&&dest!=NULL); char*ret=dest; while(*dest++=*src++) { ; } return ret; } int main() { char arr1[20]="XXXXXXXX"; char arr2[]="hello"; mystrcpy(arr1,arr2); return 0; }
三.strcat函数
1.用法
字符串追加
但是必须保证arr1数组足够大
#include<stdio.h> #include<string.h> int main() { char arr1[20]="hello "; char arr2[]="world"; strcat(arr1,arr2); printf("%s\n"arr1);//hello worlld return 0; }
2.模拟实现strcat函数
#include<stdio.h> #include<assert.h> char* strcat(char*dest,const char*src)//srcu所指向的内容不可以改变 指针本身可以改变 { assert(dest&&src); char*ret=dest; while(*dest!='\0') { dest++; } while(*src!='\0') { *dest=*src;//如果dest加上const 此句就会报错 dest++; src++; } return ret; int main() { char arr1 [20]="hello "; char arr2[]="world"; char*ret=mystrcat(arr1,arr2); printf("%s\n,rett);//hello world return 0; }
四.strcmp函数
1.用法
比较两个字符串的大小
必须使用头文件
#include<stdio.h> #include<string.h> int main() { char arr1[]="abbb"; char arr2[]="abq"; if(srcmp(arr,arr2)>0)//abbb<abq { printf(">"\n); } else { printf("<"\n); } return 0; }
使用方法: 从首字符开始 如果两者相等 则继续向下
若在某个字符 第一个字符大于第二个字符 则数组1>数组2
若 在某个字符 第一个字符小于第二个字符 则数组1<数组2
例:
abbb
abq
b<q 所以abbb<abq
2.模拟实现strcmp函数
#include<stdio.h> #include<assert.h>//const和assert断言都可不加 加上是为了代码的健壮 int mystrcmp(const char*s1,const char*s2) { assert(s1&&s2); while(*s1==*s2) { if(*s2=='\0') { return 0; } s1++; s2++; } if(*s1>*s2) { return 1; } else { return -1; } int main() { char arr1[]="abbb"; char arr2[]="abq"; int ret= mystrcmp(arr1,arr2); printf("%d\n",ret);//-1 return 0;
五.strstr函数
1.用法
strstr函数是在一个字符串中寻找另一个字符串
必循使用头文件
#include<stdio.h> #include<string.h> int main() { char arr1[]="abcdefabcdef"; char arr2[]="bcd"; char*p=strstr(arr1,arr2); if(p==NULL) { printf("没找到\n"); } else { printf("找到了:%s\n",p);//bcdefabcdef } return 0; }
如果没找到 返回 NULL
如果找到了返回第一次出现的位置
2.模拟实现strstr函数
#include<stdio.h> #include<assert.h> char*mystrstr(const char*str1,const char*str2) { const char*s1=str1; const char*s2=str2; const char*cp=str1; if(*s2==='\0') { return (char*)str1;//str1也为const修饰的 所以需要强制类型转换 } while(*cp) { s1=cp; s2=str2; while(*s1&&*s2&&(*s1==*s2))//为了防止两者相同的情况发生 { s1++; s2++; } if(*s2=='\0') { return (*cp);//cp为const修饰的 想要返回char* 要强制类型转换 } cp++; } return NULL; int main() { char arr1[]="abbbcdef"; char arr2[]="bbc"; char*p=mystrtsr(arr1,arr2); if(p==NULL) { printf("没找到\n"); } else { printf(找到了:%s",p);//bbcdef } return 0; }
六.strtok函数
1.用法
切割字符串
第一个参数为字符串本身 第二个参数为分隔符集合
必须使用头文件
#include<stdio.h> #include<string.h> int main() { char arr[] = "2637@qq.com"; const char* p = "@ ."; char tmp[20] = { 0 }; //strtok一般会切割字符串 所以用临时拷贝 strcpy(tmp, arr); char* ret = NULL; ret = strtok(tmp, p);//第一次传字符串本身 会将第一次遇见的分隔符变成'\0'并返回起始位置地址 printf("%s\n", ret); ret = strtok(NULL, p);//为NULL时 在上次分隔符开始 直到再次遇见分隔符 变成'\0' printf("%s\n", ret); ret = strtok(NULL, p); printf("%s\n", ret); return 0; }
结果为 2637 qq com