1. 字符分类函数
2. 字符转换函数
3. strlen的使⽤和模拟实现
4. strcpy的使⽤和模拟实现
5. strcat的使⽤和模拟实现
6. strcmp的使⽤和模拟实现
7. strstr的使⽤和模拟实现
8. strtok函数的使⽤
接下来让我们一 一介绍每个函数的使用方法和如何模拟实现吧!!!
1 .C语⾔中有⼀系列的函数是专⻔做字符分类的,也就是⼀个字符是属于什么类型的字符的。 这些函数的使⽤都需要包含⼀个头⽂件是 ctype.h
我就给大家介绍一下islower和isupper:
islower是判断这个字符是不是小写,如果是,那么为真;如果为大写,那么就为假
#include<stdio.h>
#include<ctype.h>
int main()
{
char ch = 0;
scanf("%c",&ch);
if(islower(ch))//如果是小写字母,那么为真
{
printf("是小写字母");
}
else
{
printf("不是小写字母");
}
return 0;
}
isupper则是判断是否为大写字母,和islower相反
#include<stdio.h>
#include<ctype.h>
int main()
{
char ch = 0;
scanf("%c",&ch);
if(isupper(ch))//如果是大写字母,那么为真
{
printf("是大写字母");
}
else
{
printf("不是大写字母");
}
return 0;
}
2. 字符转换函数
再C语言种提供了俩种字符转换函数,分别是tolower和toupper
tolower可以将大写字母转为小写字母
#include<stdio.h>
#include<ctype.h>
int main()
{
char ch = 0;
scanf("%c",&ch);
if(isupper(ch))//如果是大写字母,则为真,进入if语句
{
ch = tolower(ch);//将大写字母转为小写字母
printf("%c",ch);
}
else
{
printf("%c",ch);//不是大写字母,那么就是小写字母,直接打印
}
return 0;
}
toupper则是将小写字母转为大写字母,和tolower相反
#include<stdio.h>
#include<ctype.h>
int main()
{
char ch = 0;
scanf("%c",&ch);
if(islower(ch))//如果是小写字母,则为真,进入if语句
{
ch = toupper(ch);//将小写字母转为大写字母
printf("%c",ch);
}
else
{
printf("%c",ch);//不是小写字母,那么就是大写字母,直接打印
}
return 0;
}
当我们会使用前面介绍的字符函数,那么我们思考一下:能不能把一句话里面的小写字母全部转换为大写字母呢?如:I Like C -->I LIKE C
#include<stdio.h>
#include<ctype.h>
int main()
{
char ch[20]="I Like C";
size_t sz = sizeof(ch) / sizeof(ch[0]);
char* p = ch;//把ch的首地址赋给指针p,因为下面for循环后,ch指向的地址就不再是首元素地址
int i=0;
for(i=0;i<sz;i++)
{
if(islower(ch[i]))
{
ch[i] = toupper(ch[i]);
}
}
printf("%s",p);//刚开始我们让p记住了ch的首元素地址,所以用p的储存的首元素地址
//就可以顺藤摸瓜找到字符串后面所有的地址
return 0;
}
3. strlen 的使⽤和模拟实现
字符串以 '\0' 作为结束标志,strlen函数返回的是在字符串中 '\0' 前⾯出现的字符个数(不包 含 '\0' )。
参数指向的字符串必须要以 '\0' 结束。
注意函数的返回值为 size_t,是⽆符号的!!!无符号!!!!
接下来让我们来看看strlen是如何使用的吧!!!
#include<stdio.h>
#include<string.h>
int main()
{
char arr1[]="abcdefg";
char arr2[]="abcd";
if(strlen(arr2)-strlen(arr1) > 0)//注意!!strlen是无符号
//所以即使4-7为负,但是strlen是为正
{
printf(">");
}
else
{
printf("<=");
}
return 0;
}
那让我们来模拟实现一下strlen函数吧!
#include<stdio.h>
#include<string.h>
int my_strlen(const char *arr)
{
int count =0;//计数器,计算元素个数
while(*arr!='\0')//如果arr找到'\0',则跳出循环
{
count ++;
arr++;//让arr往后面走,直到找到'\0'
}
return count;
}
int main()
{
char arr[]="abcdefgh";
size_t len = my_strlen(arr);
printf("%d\n",len);
return 0;
}
4. strcpy 的使⽤和模拟实现
strcpy是一个拷贝字符串函数,它可以拷贝我们想要的内容,但是要注意以下几点;
1.源字符串必须以 '\0' 结束。
2.会将源字符串中的 '\0' 拷⻉到⽬标空间。
3.⽬标空间必须⾜够⼤,以确保能存放源字符串。
4.⽬标空间必须可修改。
#include<stdio.h>
#include<string.h>
int main()
{
const char arr1[10]="abcdefg";//source源头字符数组
//我们不想让源头的内容被修改,所以加const限定
char arr2[20]={0};//destination目标数组,想要拷贝到这个arr2数组
strcpy(arr2,arr1);
printf("%s\n",arr2);
return 0;
}
当我们会使用strcpy字符串函数,那我们也来试试模拟实现这个函数吧!!
#include<stdio.h>
#include<string.h>
#include<assert.h>
char* my_strcpy(char* dest,const char*src)
{
assert(dest && src!=NULL);
char* r = dest;//先把dest的起始地址储存起来,方面最后打印
while(*dest++ = *src++)//解引用的优先级高于++,所以会先复制,然后俩个指针再往后走
//与此同时,当遇到\0时,循环跳出,并且将\0复制给dest,非常巧妙!!
{
;
}
return r;//因为我们刚开始有记录arr2的起始位置,所以直接返回r
//如果不记录起始位置,那么再while循环中,arr2就会一直加加到后面的地址去
}
int main()
{
const char arr1[10]="abcdefghi";
char arr2[20]={0};
my_strcpy(arr2,arr1);
printf("%s\n",arr2);
return 0;
}
5. strcat 的使⽤和模拟实现
在使用strcat时候,也要注意以下几点:
1.源字符串必须以 '\0' 结束。
2.⽬标字符串中也得有 \0 ,否则没办法知道追加从哪⾥开始。
3.⽬标空间必须有⾜够的⼤,能容纳下源字符串的内容。
4.⽬标空间必须可修改。
strcat是追加字符,可以把我们想要追加的字符放在数组的后面,看看下面例子:
#include<stdio.h>
#include<string.h>
int main()
{
char arr1[20]="Hello ";
char arr2[10]="World";
//希望把world追加到Hello后面
strcat(arr1,arr2);//arr1就是dest。arr2就是src
printf("%s\n",arr1);
return 0;
}
当我们会使用strcat时,那么我们也来尝试模拟这个有趣的函数!!
#include<stdio.h>
#include<string.h>
#include<assert.h>
char* my_strcat(char* dest,const char* src)
{
assert(dest && src !=NULL);
char* r = dest;//先让r储存dest的起始位置
while(*dest)
{
dest++;//这个循环是为了让dest找到\0,方便把src的字符追加到dest后面
}
while(*dest++ = *src++)
{
;
}
return r;//返回r储存dest的起始位置
}
int main()
{
char arr1[20]="Hello ";
char arr2[20]="I like C";
my_strcat(arr1,arr2);
printf("%s\n",arr1);
return 0;
}
6. strcmp 的使⽤和模拟实现
strcmp是比较俩个字符串的大小,但是不是比较谁的字符串长,而是一 一比较他们每个字符ASCII值的大小,最后得出哪个字符串大
#include<stdio.h>
#include<string.h>
int main()
{
char arr1[10]="abcdefg";
char arr2[10]="abq";
int r = strcmp(arr1,arr2);//即使arr1的字符串比arr2长,但是比较的是他们每个元素的ASCII值
//因为q的ASCII大于c,所以字符串arr2大于arr1,返回 < 0
printf("%d\n",r);
return 0;
}
当我们会使用strcmp时,那就让我们来尝试模拟一下这个函数吧!!!
#include<stdio.h>
#include<string.h>
#include<assert.h>
int my_strcmp(const char* buf1,const char* buf2 )
{
assert(buf1 && buf2 !=NULL);
while(*buf1 == *buf2)//如果俩个字符相等,则进入循环,但是有俩种情况是相等的
//第一种:他们只是第一个或则第二个字符相等
//第二种:他们俩个字符串完全相等,并且都加加到\0
{
if(*buf1 == '\0')//这个就是属于第二种,他们俩个字符串如果都相等,那么随机一个都是\0
{
return 0;//返回0,因为俩个字符串相等
}
buf1++;
buf2++;
}
if(*buf1 > *buf2)//如果不相等,跳出循环,在进一步判断哪个字符串大
{
return 1;
}
else
{
return -1;
}
}
int main()
{
char arr1[10]="abcdefghp";
char arr2[10]="abcdf";
int r = my_strcmp(arr1,arr2);
printf("%d\n",r);
return 0;
}
7. strstr 的使⽤和模拟实现
strstr作用是在字符串中找子串,如果找到了,则从子串的起始位置往后打印后面的字符
函数返回字符串str2在字符串str1中第⼀次出现的位置
字符 串的⽐较匹配不包含 \0 字符,以 \0 作为结束标志
如果strstr函数找不到,则会返回空指针-NULL
#include<stdio.h>
#include<string.h>
int main()
{
char arr1[]="abcdefghi";
char* p = strstr(arr1,"bcd");//在arr1中找bcd字符串
//用指针p来接收strstr返回的地址
printf("%s\n",p);
return 0;
}
当我们会使用strstr函数时,那就让我们来尝试模拟实现这个有趣的函数!!
#include<stdio.h>
#include<string.h>
#include<assert.h>
char* my_strstr(const char* buf1,const char* buf2)
{
assert(buf1 && buf2 !=NULL);
char* cru = buf1;//让cru记住buf1的起始地址
char* b1 = NULL;//让b1遍历buf1数组
char* b2 = NULL;//让b2遍历buf2数组
while(*cru != '\0')//如果*cru每次不为\0,则进循环
{
b1 = cru;//把cru的地址赋给b1,让b1去遍历buf1数组
b2 = buf2;//把buf2地址赋给b2,让b2去遍历buf2数组
while(b1 && b2 && *b1==*b2)//如果俩个数组字符相等,则每次b1和b2加加,找下一个字符
{
b1++;
b2++;
}
if(*b2 == '\0')//如果跳出第二个while循环,就会判断一下b2是否指向\0
//如果b2已经指向\0,说明可以在buf1里面找到子串
{
return (char*)cru;
}
cru++;//如果其中有一个字符不相等,则cru++,然后重新进第一个循环,在把cru赋给b1
//让b1从cru++位置重新遍历数组
}
return NULL;//如果跳出第一个循环,说明buf1找到\0都没找到,说明找不到buf2这个子串
//那么返回空指针
}
int main()
{
char arr1[20]="abbbcdefg";
char arr2[10]="bbc";
char* p = my_strstr(arr1,arr2);
if(p == NULL)
{
printf("找不到\n");
}
else
{
printf("找到了:%s\n",p);
}
return 0;
}
strstr字符串函数的模拟是不是有点难,我也是这么觉得,所以小伙伴们要多花点时间去理解里面的含义哦!!!
8. strtok 函数的使⽤
strtok是用来分割函数,提取字符串的函数,比较特别有意思
#include<stdio.h>
#include<string.h>
int main()
{
const char arr1[20]="[email protected]";
char arr2[]={0};
strcpy(arr2,arr1);//把arr1的数组先复制到arr2,因为在切割时候会破环数组,防止破坏原数组
//所以要重新创建一个数组来储存原数组
const char* p = "@.";//当遇到字符@和.时,就会切割字符,然后读取首元素地址,传给p
char* r = NULL;//创建一个空指针r
for(r = strtok(arr2,p);r != NULL;r = strtok(NULL,p))
//刚开始for循环,把strtok切割到的字符首元素地址传给r,如果有切割到,则传给r的就不是NULL
//那么循环继续,第二次strtok(NULL,p)就可以
//因为第二次strtok会利用NULL找到上一次切割的位置继续切割
{
printf("%s\n",r);
}
return 0;
}
标签:ch,return,函数,C语言,char,arr2,arr1,字符串,include
From: https://blog.csdn.net/CJH20050707/article/details/143703778