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的数字
不是小写字母返回0
isupper函数
是大写字母返回大于0的数字
不是大写字母返回0
字符转换函数
int tolower ( int c ); //将参数传进去的⼤写字⺟转⼩写int toupper ( int c ); //将参数传进去的⼩写字⺟转⼤写
小写转大写就是-32
大写转小写就是+32
字符串小写转大写
下面这代码我们可以看到利用islower函数判断是不是小写,是的话利用toupper转大写
当然+32也是可以的
字符串大写转小写
下面这代码我们可以看到利用isupper函数判断是不是小写,是的话利用tolower转小写
当然-32也是可以的
strlen函数的使用和模拟实现
需要的头文件:#include<string.h>
https://cplusplus.com/reference/cstring/strlen/?kw=strlen
strlen是计算字符串长度的
strlen模拟实现计数器⽅式
利用一个变量来计数
//计数器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函数
//不能创建临时变量计数器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指针-指针的⽅式
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' 拷⻉到⽬标空间。
⽬标空间必须⾜够⼤,以确保能存放源字符串。
⽬标空间必须可修改。
stcpy模拟实现
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函数就是在字符串后面追加字符串
strcat模拟实现
就是先把r往后走到\0停下来,然后arr赋值到r后面
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/
strcmp是比较字符串的,当然是一个一个字符比较的
小于就返回小于0的数字
大于就返回大于0的数字
等于返回0
下面这代码我们可以看到s比z小返回-1
比较是通过ASCII码来比较的
stcmp模拟实现
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这个数可以自己指定要复制多少个字符
strncpy模拟实现
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/
这个函数可以自己指定要追加多少个字符
strncat模拟实现
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/
这个函数可以自己指定要比较多少个字符
strncmp模拟实现
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;}
声明
本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。