今天我学习了一些字符串函数,希望和大家分享一下。
1.strlen:求字符串的长度。
(1)正常方法。 #include<stdio.h> #include<assert.h> #include<Windows.h> int my_strlen(char *str1) //定义一个求字符串长度的函数。 { int n=0; assert(str1); //断言str1不为0。 while(*str1!='\0') { n++; //循环字符串计数,直到'\0'退出循环,得到长度。 str1++; } return n; } int main() { char str1[]="I am a college student"; printf("%d\n",my_strlen(str1)); system("pause"); return 0; }
(2)递归法 #include<stdio.h> #include<Windows.h> int my_strlen(char *str1) //定义一个求字符串长度的函数。 { if(*str1=='\0') //用递归的方法求长度。 { return 0; } return my_strlen(str1+1)+1; } int main() { char str1[]="I am a college student"; printf("%d\n",my_strlen(str1)); system("pause"); return 0; }
注意;字符串已经'\0'作为结束标志,strlen函数返回的是在字符串中'\0'前面出现的字符个数。函数的返回值是无符号的。
2.strcat:拼接函数。
#include<stdio.h> #include<assert.h> #include<Windows.h> char *my_strcat(char *str1,char *str2) //定义一个拼接函数。 { char *ret=str1; //定义一个指针变量指向str1. assert(str1); assert(str2); //断言两个参数不为空。 while(*str1) { str1++; } //循环str1直到\0。 while(*str1=*str2) //此时开始拷贝。 { str1++; str2++;} return ret; } int main() { char str1[20]="abcdef"; char str2[20]="123456"; my_strcat(str1,str2); printf("%s\n",str1); //得到str2拼接到str1里的字符串。 system("pause"); return 0; }
注意:源字符串必须以'\0'结束。目标空间必须足够大,能容下源字符串的内容。目标空间可以修改。同时,字符串不可以给自己追加,这样会造成死循环。
3.strcpy:拷贝函数。
#include<stdio.h> #include<assert.h> #include<Windows.h> char *my_strcpy(char *str1,const char *str2) //定义一个拷贝函数。 { char *ret=str1; //定义一个指针变量指向str1. assert(str1); //断言两个参数不为空。 assert(str2); while((*str1=*str2)) //循环将str2复制到str1里去。 { str1++; str2++; } return ret; } int main() { char str1[10]; char str2[10]="abcdef"; my_strcpy(str1,str2); printf("str1=%s\n",str1); //得到复制后的str1. system("pause"); return 0; }
注意:会将源字符串中的'\0'拷贝到目标空间。目标空间必须足够大,必须可变。
4.strcmp:比较函数。
#include<stdio.h> #include<assert.h> #include<Windows.h> int my_strcmp(char *str1,const char *str2) //定义一个比较函数。 { int ret=0; assert(str1); //断言两个数组不为空。 assert(str2); while(!(ret=*(unsigned char *)str1-*(unsigned char *)str2) && *str2) { ++str1;++str2; //分别比较两个数组中每一个元素的大小。 } if(ret<0) { //如果str1小于str2则输出-1. ret=-1; } else if(ret>0) //如果str1大于str2输出1. { ret=1; } else //如果相等输出0. { ret=0; } return (ret); } int main() { char str1[]="abdufgh"; char str2[]="abdefgh"; printf("%d\n",my_strcmp(str1,str2)); //得到结果。 system("pause"); return 0; }5.strncpy:拷贝n个字符。
#include<stdio.h> #include<assert.h> #include<Windows.h> int my_strncpy(char *str1,char *str2,int size) //定义一个拷贝size个字符到目标空间。 { assert(str1); assert(str2); //断言str1,str2不为空,size大于0. assert(size>0); while(size--) { //通过循环将str2赋给str1. *str1=*str2; str1++; str2++; } return 0; } int main() { char str1[]={"He is a lucky boy!"}; char str2[]={"It"}; int size=2; my_strncpy(str1,str2,size); //调用函数。 printf("%s\n",str1); //输出结果。 system("pause"); return 0; }6.strncat:拼接n个字符。
#include<stdio.h> #include<assert.h> #include<Windows.h> int my_strncat(char *str1,char *str2,int size) //定义一个拼接size个字符函数。 { assert(str1); //断言str1,str2不为空,size大于0. assert(str2); assert(size>0); while(*str1) //循环自加str1,直到'\0'停止开始拷贝。 { str1++; } while(size--) { //拷贝str2到str1里。 *str1=*str2; str1++; str2++; } return 0; } int main() { char str1[80]="I am the fans of Lakers "; char str2[80]="because of the KOBE"; int size=10; //确定拷贝的字符数。 my_strncat(str1,str2,size); //调用函数。 printf("%s",str1); //输出结果。 printf("\n"); system("pause"); return 0; }7.strncmp:比较n各字符的大小。
#include<stdio.h> #include<assert.h> #include<Windows.h> int my_strncmp1(char *str1,char *str2,int num) //这是不区别大小写的。 { assert(str1); assert(str2); assert(num>0); if(*str1>='A'&&*str1<='Z') { *str1=*str1+32; } if(*str2>='A'&&*str2<='Z') { *str2=*str2+32; } while((*str1==*str2) && (num--)) { str1++; str2++; } return (*str1-*str2); } int my_strncmp(char *str1,char *str2,int num) //定义一个比较num个字符的大小。注:这是区别大小写的。 { assert(str1); //断言。 assert(str2); assert(num>0); while((*str1==*str2) && (num--)) //当str1,str2相等并且num不为0时,继续往后比。 { str1++; str2++; } return (*str1-*str2); //不相等时用减法得到值。 } int main() { char t; char str1[]="He is a college student"; char str2[]="he is a excited student"; int num=4; int result1=my_strncmp(str1,str2,num); int result2=my_strncmp1(str1,str2,num); //将函数调用出来的值赋给result。 if(result1>0) //result1是区分大小写。 { //result2是不区分大小写的。 t='>'; //如果大于0,则str1大于str2. } else if(result1<0) { t='<'; //如果小于0,则str1小于str2. } else{ t='='; } //否则两个相等。 printf("str1 %c str2\n",t); if(result2>0) { t='>'; //如果大于0,则str1大于str2. } else if(result2<0) { t='<'; //如果小于0,则str1小于str2. } else{ t='='; } printf("str1 %c str2\n",t); system("pause"); return 0; }8.strchr:查看子符第一次出现的位置。
#include<stdio.h> #include<assert.h> #include<Windows.h> int my_strchr(char *str1, char a) //定义一个求一个字符在一个字符数组中第一次出现的位置的函数。 { char *p=str1; //定义两个指针变量指向str1. char *q=str1; int n=0; //位置数。 assert(str1); //断言。 while(*p) { q=p; //循环每次都要将p赋给q。 while(*q&&*q==a) { n++; return n; //如果q与a相等则输出n。 } if(*q=='\0') { //如果q为0输出0. return 0; } else{ //如果q与a不同,p往后走一位,n在加1,继续循环。 p++; n++; } } return n; } int main () { char str1[]="abc def ghi jkl mn"; char a='j'; printf("first j found at position %d\n",my_strchr(str1,a)); //得到结果。 system("pause"); return 0; }9.strrchr:查找一个字符在字符串中最后一次出现的位置。
#include<stdio.h> #include<assert.h> #include<windows.h> int my_strrchr(char *str1,char a) { int n=0; int len=strlen(str1); char *q=&str1[len-1]; assert(str1); while(*q) { if(*q==a) { return (len-n); } else if(*q==NULL) { return 0; } else if(*q!=a) { n++; q--; } } return 0; } int main() { char str1[]="I am the interested people"; char a='l'; printf("%d\n",my_strrchr(str1,a)); system("pause"); return 0; }10.strpbrk:返回第一个字符串中第一个出现在第二个字符串中的字符的地址。
#include<stdio.h> #include<assert.h> #include<windows.h> int my_strpbrk(char *str1,char *str2) //模拟实现strpbrk函数。 { char *p=str1; char *q=str2; char *m=str2; assert(str1); //断言str1和str2不为空。 assert(str2); while(*p!='\0') { while(*p!=*q && *q!='\0') //取str1第一个字符与str2每个字符不等继续,相等退出。 { q++; } if(*p==*q && *q!='\0') //如果相等就输出字符。 { printf("%c ",*q); p++; q=m; } else if(*q=='\0') //不等就继续比较。 { p++; q=m; } } return 0; } int main() { char str1[]="This is a simple string"; char str2[]="aeiou"; my_strpbrk(str1,str2); printf("\n"); system("pause"); return 0; }
11.strstr:查看一个字符串在另一个字符串中第一次出现的位置。
#include<stdio.h> #include<assert.h> #include<Windows.h> char *my_strstr(char *str1,char *str2) //定义一个寻找子字符串的函数。 { char *p=str1; //定义指针变量指向str1和str2. char *q=NULL; char *m=str2; assert(str1); assert(str2); while(*p){ //当str1不为0时进行循环。 q=p; //q指向p,m指向str2. m=str2; while(*q&&*m&&(*q==*m)) //当q,m都不为空并且两个数相等时进行循环。 { q++; m++; } if(*m=='\0') //如果m为0,则证明str2是str1的子字符串。 { return 'Y'; } else if(*q=='\0') //如果q等于0,则不是子字符串。 { return 'N'; } else //如果q,m不相等,则p++继续往后走。 { p++; } } } int main() { char str1[10]="abcdefg"; char str2[10]="defgh"; printf("%c\n",my_strstr(str1,str2)); //输出结果。 system("pause"); return 0; }
12.strspn:返回str1字符串中开始部分匹配str2字符串中字符的个数。
#include<stdio.h> #include<assert.h> #include<Windows.h> int my_strspn(char *str1,char *str2) //模拟实现strspn函数。 { int n=0; //计数n。 char *p=str1; char *q=str2; char *m=str2; //定义指针变量方便一个一个字符比较。 assert(str1); assert(str2); //断言。 while(*p) { while((*q!='\0')&&(*p!=*q)) //当不相等时循环。 { q++; } if(*p==*q) //相等时计数,str1网后一位,str2返回开头,再次重复操作。 { n++; p++; q=m; } else if(*q=='\0') { p++; q=m; } } return n; } int main() { char str1[]="129th"; char str2[]="1234567890"; printf("%d\n",my_strspn(str1,str2)); system("pause"); return 0; }13.strcspn:返回str1字符串中开始部分不匹配str2字符串中字符的个数。
#include<stdio.h> #include<assert.h> #include<Windows.h> int my_strcspn(char *str1,char *str2) //模拟实现strcspn函数。 { int n=0; //计数n。 char *p=str1; char *q=str2; char *m=str2; //定义指针变量方便一个一个字符比较。 assert(str1); assert(str2); //断言。 while(*p) { while((*q!='\0')&&(*p!=*q)) //当不相等时循环。 { q++; } if(*p==*q) //相等时计数,str1网后一位,str2返回开头,再次重复操作。 { p++; q=m; } else if(*q=='\0') { n++; p++; q=m; } } return n; } int main() { char str1[]="yuming129"; char str2[]="1234567890"; printf("%d\n",my_strcspn(str1,str2)); system("pause"); return 0; }这就是我总结的字符串函数,希望大家了解一下。