C语言:字符函数和字符串函数

孤独且没人爱的纸鹤 2024-06-17 08:35:02 阅读 99

目录

字符分类函数

islower函数

isupper函数

字符转换函数

strlen函数的使用和模拟实现

strlen模拟实现计数器⽅式

strlen模拟实现不能创建临时变量计数器

strlen指针-指针的⽅式

stcpy的使用和模拟实现

stcpy模拟实现

strcat的使用和模拟实现

strcat模拟实现

strcmp的使用和模拟实现

stcmp模拟实现

strncpy函数

strncpy模拟实现

strncat函数

strncat模拟实现

strncmp函数

strncmp模拟实现

strtok函数

strerror函数

strstr函数的使用和模拟实现

strstr函数的模拟实现

​编辑

模拟的strstr


在编程的过程中,我们经常要处理字符和字符串,为了⽅便操作字符和字符串,C语⾔标准库中提供了⼀系列库函数,接下来我们就学习⼀下这些函数。

字符分类函数

C语⾔中有⼀系列的函数是专⻔做字符分类的,也就是⼀个字符是属于什么类型的字符的。

这些函数的使⽤都需要包含⼀个头⽂件是 ctype.h

这里就介绍几个函数吧,用法都是一样的


islower函数

是小写字母将返回大于0的数字

6be48744219f4630966aa57e10d542cd.png


不是小写字母返回0

a46a9694b3884f8d831e34630f341225.png


isupper函数

是大写字母返回大于0的数字

ea5fdca8213848bda105892448e68379.png


不是大写字母返回0

bb6bdfd2a937476aa3775694e6b0b21f.png


字符转换函数

int tolower ( int c ); //将参数传进去的⼤写字⺟转⼩写int toupper ( int c ); //将参数传进去的⼩写字⺟转⼤写

小写转大写就是-32

大写转小写就是+32

字符串小写转大写

下面这代码我们可以看到利用islower函数判断是不是小写,是的话利用toupper转大写

当然+32也是可以的

2da41c28fe1449b7a64fd67fe1493986.png


字符串大写转小写

下面这代码我们可以看到利用isupper函数判断是不是小写,是的话利用tolower转小写

当然-32也是可以的

6b7fad6407b94d21bd1be40cbb938a2b.png


strlen函数的使用和模拟实现

需要的头文件:#include<string.h>

https://cplusplus.com/reference/cstring/strlen/?kw=strlen

strlen是计算字符串长度的

2b59cca1ad474f2298d7e9a5c5206f97.png


strlen模拟实现计数器⽅式

利用一个变量来计数

2d16441576b04e07abf0e535813d77d9.png

//计数器int mn_strlen(char* x){//计数器int num = 0;while (*x != '\0'){num++;x++;}return num;}int main(){char arr[] = "asdfsffgdg";int r = mn_strlen(arr);printf("%d\n", r);return 0;}


strlen模拟实现不能创建临时变量计数器

使用递归方法实现strlen函数

45d35c16faf149e48d0f3c6d3b5f173c.png

//不能创建临时变量计数器int mn_strlen(char* x){if (*x == '\0'){return 0;}else{//每次递归,地址往后走,遇到\0回归return 1 + mn_strlen(x + 1);}}int main(){char arr[] = "asdfsffgdg";int r = strlen(arr);printf("%d\n", r);return 0;}


strlen指针-指针的⽅式

29a69d4d24d5425dba6b5fe88fd1ec90.png

int mn_strlen(char* x){int* p = x;//循环往后到\0while (*p != '\0'){p++;}//通过后面的地址减去首地址就可以拿到有多少个了return p - x;;}int main(){char arr[] = "asdfsffgdg";int r = strlen(arr);printf("%d\n", r);return 0;}


stcpy的使用和模拟实现

需要的头文件:#include<string.h>

https://legacy.cplusplus.com/reference/cstring/stcpy/

这个函数是复制字符串

源字符串必须以 '\0' 结束。

会将源字符串中的 '\0' 拷⻉到⽬标空间。

⽬标空间必须⾜够⼤,以确保能存放源字符串。

⽬标空间必须可修改。

3b9b2e5f509642e59a7343934c791366.png


stcpy模拟实现

187362e311694620bc1c51317a7db5ab.png

char* mn_stcpy(char* x, char* y){while (*y != '\0'){*x = *y;x++;y++;}}int main(){char arr[] = "asfsdfs";char r[99] = { 0 };mn_stcpy(r, arr);printf("%s\n", r);}


strcat的使用和模拟实现

需要的头文件:#include<string.h>

https://legacy.cplusplus.com/reference/cstring/strcat/

strcat函数就是在字符串后面追加字符串

d0c0cd7ee11d4b688c0524f3ce056899.png


strcat模拟实现

就是先把r往后走到\0停下来,然后arr赋值到r后面

28319235ac1147b4818fe824099b5fe5.png

char* mn_strcat(char* r, char* arr){//r走到\0的位置while (*r != '\0'){r++;}//把arr的字符串赋值到r字符串的后面while (*arr != '\0'){*r = *arr;r++;arr++;}}int main(){char arr[] = "asfsdfs";char r[99] = "xxxx ";mn_strcat(r, arr);printf("%s\n", r);}


strcmp的使用和模拟实现

需要的头文件:#include<string.h>

https://legacy.cplusplus.com/reference/cstring/strcmp/

21dd775738c24e9f9cad0ab4990a9fe8.png

strcmp是比较字符串的,当然是一个一个字符比较的

小于就返回小于0的数字

大于就返回大于0的数字

等于返回0

下面这代码我们可以看到s比z小返回-1

比较是通过ASCII码来比较的

ad8bc3f41179405882cd619d6470ba4f.png


stcmp模拟实现

9e13ba0bc54e46e7bd61048b9b01c73b.png

int mn_strcmp(char* x, char* y){//等于就往后找while (*x == *y){//x找到\0就说明这2个数组都是一样的if (*x == '\0'){return 0;}x++;y++;}//小于返回-1if (*x < *y){return -1;}//大于返回1else{return 1;}}int main(){char arr[] = "asfsdfs";char arr2[] = "asfzdfs";int r = mn_strcmp(arr, arr2);printf("%d\n", r);}


strncpy函数

需要的头文件:#include<string.h>

https://legacy.cplusplus.com/reference/cstring/strncpy/

strcpy是复制整个字符串,str n cpy这个数可以自己指定要复制多少个字符

78078dbdeb554534903245c1d1d655f0.png

e10bd2ac17c447449692b1dff783513e.png


strncpy模拟实现

ccd0e164e6ca448290c47d07037643fd.png

char* mn_strncpy(char* r, char* arr, size_t sz){while (sz--){*r = *arr;r++;arr++;}}int main(){char arr[] = "asfsdfs";char r[99] = {0};mn_strncpy(r, arr,3);printf("%s\n", r);}


strncat函数

需要的头文件:#include<string.h>

https://legacy.cplusplus.com/reference/cstring/strncat/

这个函数可以自己指定要追加多少个字符

aaf34f3d478d4729af42e22d645452aa.png


strncat模拟实现

388b34c3988d4b229fc2ce14475ba196.png

char* mn_strncat(char* r, char* arr, size_t sz){while (*r != '\0'){r++;}while (sz--){*r = *arr;r++;arr++;}}int main(){char arr[] = "asfsdfs";char r[99] = "xxxx ";mn_strncat(r, arr, 3);printf("%s\n", r);}


strncmp函数

需要的头文件:#include<string.h>

https://legacy.cplusplus.com/reference/cstring/strncmp/

这个函数可以自己指定要比较多少个字符

24ce1bc6c45344c38fbc5813875241ba.png


strncmp模拟实现

87f662342b9744099f5ff0ef91dc72c6.png

int mn_strncmp(char* x, char* y, size_t sz){//循环判断x等于y就往后走,不等于就跳出while (*x == *y){//sz等于0了,就说明这些字符是一样的if (sz == 0){return 0;}x++;y++;sz--;}//判断大于,小于if (*x < *y){return -1;}else{return 1;}}int main(){char arr[] = "asfsdfs";char arr1[] = "asfsdfs";int r = mn_strncmp(arr, arr1, 3);printf("%d\n", r);}


strtok函数

https://legacy.cplusplus.com/reference/cstring/strtok/

char * strtok ( char * str, const char * sep);

strtok函数找到str中的下⼀个标记,并将其⽤ \0 结尾,返回⼀个指向这个标记的指针。(注:

strtok函数会改变被操作的字符串,所以在使⽤strtok函数切分的字符串⼀般都是临时拷⻉的内容

并且可修改。)

• strtok函数的第⼀个参数不为 NULL ,函数将找到str中第⼀个标记,strtok函数将保存它在字符串

中的位置。

• strtok函数的第⼀个参数为 NULL ,函数将在同⼀个字符串中被保存的位置开始,查找下⼀个标

记。

• 如果字符串中不存在更多的标记,则返回 NULL 指针。

strtok函数的第⼀个参数不为 NULL ,函数将找到p中第⼀个标记,strtok函数将保存它在字符串

中的位置。

strtok函数的第⼀个参数为 NULL ,函数将在同⼀个字符串中被保存的位置开始,查找下⼀个标


strerror函数

https://legacy.cplusplus.com/reference/cstring/strerror/

strerror函数可以把参数部分错误码对应的错误信息的字符串地址返回来。

在不同的系统和C语⾔标准库的实现中都规定了⼀些错误码,⼀般是放在 errno.h 这个头⽂件中说明

的,C语⾔程序启动的时候就会使⽤⼀个全⾯的变量errno来记录程序的当前错误码,只不过程序启动

的时候errno是0,表⽰没有错误,当我们在使⽤标准库中的函数的时候发⽣了某种错误,就会讲对应

的错误码,存放在errno中,⽽⼀个错误码的数字是整数很难理解是什么意思,所以每⼀个错误码都是

有对应的错误信息的。strerror函数就可以将错误对应的错误信息字符串的地址返回。


strstr函数的使用和模拟实现

需要的头文件:#include<string.h>

https://legacy.cplusplus.com/reference/cstring/strstr/

这是一个字符串匹配

int main(){char arr[] = "asdfddds";//匹配arr里有没有这个字符串char* p = "fdd";//没有就返回NULL,有就返回arr的qwe和后面的字符串char*r = strstr(arr, p);if (r == NULL){printf("不存在");}else{printf("%s\n", r);}}


strstr函数的模拟实现

main函数


模拟的strstr

我们可以创建是S1和S2这2个指针进行比较

创建sz指针把arr的地址给sz,让sz找\0这样的话,

sz赋值给s1,p赋值给s2

s1有2个相同第3个不同这样的话可以返回回来sz++继续找下一个

s2也是一样第3个不同可以返回回来

char* mn_strstr(char* arr, char* p){char* s1 = NULL;char* s2 = NULL;char* sz = arr;while (*sz != '\0'){//赋值给s1和s2去匹配,这样的话s1找不到的话sz赋值回来继续找s2也一样s1 = sz;s2 = p;while (*s1 == *s2){s1++;s2++;//s2的走到\0就说明找到了if (s2 == '\0'){//返回sz的地址return sz;}}sz++;}//找不到返回NULLreturn NULL;}



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。