一、字符分类函数
以一个函数为例子·:
intislower(intc);//判断参数部分的c是否是小写字母,如果是,就返回一个非零值,如果不是,就返回零。下面是应用这个函数进行大写转小写的代码:
#defineCRT_SECURE_NO_WARNINGS#include<stdio.h>#include<ctype.h>intmain(){chara[]="I am a student!";inti=0;intc=0;while(a[i]){c=a[i];if(islower(c)){c-=32;}putchar(c);i++;}return0;}二、字符转换函数
c语言提供了两个字符转换函数:
inttolower(intc);//将参数转化为小写字母inttoupper(intc);//将参数转化为大写字母利用小写转化的函数,可以简化上面的代码:
intmain(){chars[]="I am a student!";inti=0;while(s[i]){if(islower(s[i])){s[i]=toupper(s[i]);}putchar(s[i]);i++;}return0;}三、strlen
注意,strlen的返回值是size_t类型,如果被转化成整型,可能出现负数变成一个很大的正数情况。
下面用递归的方式进行该函数的模拟实现:
size_tmy_strlen(constchar*s){if(*s)return1+my_strlen(s+1);elsereturn0;//可以画图理解先递推后回归得到3的过程。}intmain(){size_tlen=my_strlen("abc");printf("%d",len);return0;}四、strcpy
功能:字符串拷贝
代码演示:
intmain(){chararr1[10]={0};chararr2[]="abc";strcpy(arr1,arr2);printf("%s",arr1);return0;}模拟实现:
char*my_strcpy(char*arr1,char*arr2){char*ret=arr1;while(*arr2){*arr1=*arr2;arr1++;arr2++;}*arr1=*arr2;returnret;}intmain(){chararr1[10]={0};chararr2[]="abc";my_strcpy(arr1,arr2);printf("%s",arr1);return0;}五、strcat
功能:字符串追加
代码演示:
intmain(){chararr1[30]="hello";//注意要给目标数组足够的空间,否则有溢出的风险chararr2[]="world";strcat(arr1,arr2);printf("%s",arr1);return0;}模拟实现:
char*my_strcat(char*arr1,char*arr2){char*ret=arr1;while(*arr1){arr1++;}while(*arr2){*arr1=*arr2;arr1++;arr2++;}returnret;}intmain(){chararr1[20]="abc";chararr2[]="def";my_strcat(arr1,arr2);printf("%s",arr1);return0;}六、strcmp
功能:用来比较str1和str2指向的字符串。从两个字符串第一个字符开始比较ascll码值,相等就比较下一个,直到全部结束
返回值:第一个字符串大于第二个,就返回大于0的数;等于就返回0;小于就返回小于0的数。
代码演示:
intmain(){chars1[]="abcd";chars2[]="abde";intr=strcmp(s1,s2);if(r>0)printf("s1>s2");elseif(r=0)printf("s1==s2");elseprintf("s1<s2");return0;}模拟实现:
intmy_strcmp(constchar*s1,constchar*s2){while(*s1==*s2){if(*s1==0&&*s2==0)return0;s1++;s2++;}intcpm=*s1-*s2;if(cpm>0)printf("s1>s2");elseprintf("s1<s2");return*s1-*s2;}intmain(){chars1[]="abc";chars2[]="abd";my_strcmp(s1,s2);return0;}七、strncpy、strncat、strncmp
三个函数和前面一组三个函数的区别在于,这一组有字符的限制,限制了最多拷贝的字符个数。
但是存在小区别:strncpy拷贝过后不会自动加上\0,但是strncat会。
写代码时建议用这一组函数,更加安全。
八、strstr
功能:查找str2指向的字符串在str1字符串中第一次出现的位置。
返回值:如果能够查找,返回第一次出现位置的指针;如果不能查找到,返回空指针。
代码演示:
intmain(){chars1[]="abcde";chars2[]="de";char*p=strstr(s1,s2);printf("%s",p);return0;}顺便回忆:字符串的名字就是首元素地址。%s 的职责是:给一个地址,从那里开始打印字符直到 \0”。指针正好能提供这个地址。
九、strtok
功能:分割字符串
注意,这个函数具有破坏性,会在分割的位置加上\0,所以使用的时候需要先拷贝一份原数据。
代码演示:
intmain(){chars1[]="aaa.bbb.ccc.ddd";chars2[]=".";charcopy[30]={0};strncpy(copy,s1,30);constchar*p;for(p=strtok(s1,s2);p!=0;p=strtok(NULL,s2))//这是一种简易的写法{printf("%s\n",p);}return0;}