前言:大家好!好久不见,临近寒假,身边的事越来越多,但是,再忙也不能停止学习!
在编程过程中,我们经常处理字符和字符串,为了方便操作字符和字符串,C语言标准库中提供了一系列库函数
接下来进入这一章:字符 、字符串函数
1.字符分类函数
字符分类函数是专门为字符分类的,也就是一个字符是属于什么类型的字符
这些函数的使用都需要包含一个头文件: ctype.h
这些函数的语法非常相似,我拿一个举例
islower 判断参数部分 c 是否是小写字母
如果是小写字母返回非0整数,如果不是小写字母,则返回0
下面是将字符串中的小写字母转大写,其它字符不变
#include <stdio.h> #include <ctype.h> int main() { int i = 0; char str[] = "Love.\n"; char c; while (str[i]) { c = str[i]; if (islower(c)) c -= 32;//ASCLL码,大写小写对应的字符相差32 putchar(c);//putchar可以直接打印字符c的内容 i++; } return 0; }
2.字符转换函数
基于上面的函数,C语言提供的字符转换函数可以直接完成类似 +-32 (ascll码)的效果
直接用tolower函数完成小写转大写
#include <stdio.h> #include <ctype.h> int main() { int i = 0; char str[] = "Love\n"; char c; while (str[i]) { c = str[i]; if (islower(c)) c = toupper(c); putchar(c); i++; } return 0; }
3.strlen的使用和模拟实现
语法:
—— 计算字符串长度,从第一个字符开始计算,遇到 \0 停下,不包括 \0
—— 需要包含头文件 <string.h>
—— 返回值为无符号整型(size.t) → 当程序运行结果为负数时,最终输出为其绝对值
使用:
#include <stdio.h> #include <string.h> int main() { const char* str1 = "abcdef";//a b c d e f \0 const char* str2 = "bbb";// b b b \0 if (strlen(str2) - strlen(str1) > 0) { printf("str2>str1\n"); } else { printf("srt1>str2\n"); } return 0; }
模拟实现:
方法一(计数器):
int my_strlen(const char* str) { int count = 0; assert(str); while (*str)//*str等同于*str!=\0 { count++; str++; //char类型每次操作四个字节 } return count; }
方法二(函数递归):
int my_strlen(const char* str) { assert(str); if (*str == '\0') return 0; else return 1 + my_strlen(str + 1); }
方法三(指针-指针):
int my_strlen(char *s) { assert(str); char *p = s; while(*p != ‘\0’ ) p++; return p-s; }
4.strcpy的使用和模拟实现
语法:
——字符串拷贝,源字符串必须以 \0 结束,并将源字符串的 \0 拷贝到目标空间
——目标空间必须足够大,确保能放下源字符串
——目标空间必须可修改
——需要包含头文件 <string.h>
使用:
#include <stdio.h> #include <sting.h> int main() { char arr1[20] = { 0 }; char arr2[] = "love"; strcpy(arr1, arr2); printf("%s\n", arr1); return 0; }
模拟实现:
#include <stdio.h> #include <sting.h> #include <assert.h> char* my_strcpy(char* dest, char* src) { char*ret=dest; while (*src != '\0') { *dest = *src; dest++; src++; } *dest = *src;//这一步把最后的 \0 拷贝过去 return ret; } //优化函数 char* my_strcpy(char* dest, char* src) { char*ret=dest; assert(dest&&src ); //assset 中只要为假就报错 while (*dest++ = *src++) //当赋值到\0时,程序停止,\0的ascll值为0,0为假,到0循环停止 { ; } return ret; } int main() { char arr1[20] = { 0 }; char arr2[] = "love"; my_strcpy(arr1, arr2); printf("%s\n", arr1); return 0; }
5.strtcat的使用和模拟实现
语法:
——追加一个字符串
——源字符串和目标字符串必须以\0结尾(或有 \0)
——目标字符串必须可以修改,且足够大
——自己给自己追加不安全,谨慎使用,尽量不使用
——需要包含头文件<string.h>
使用:
#include <string.h> int main() { char arr1[20] = "love "; char arr2[] = "you"; strcat(arr1, arr2); printf("%s\n", arr1); return 0; }
模拟实现:
#include <string.h> #include <stdio.h> #include <assert.h> char* my_strcat(char* dest, const char* src) { char* ret = dest; assert(dest && src); //找到目标空间的\0,以使拷贝时能从\0处拷贝 while (*dest) { dest++; } while (*dest++ = *src++) { ; } return ret; } int main() { char arr1[20] = "love "; char arr2[] = "you"; my_strcat(arr1, arr2); printf("%s\n", arr1); return 0; }
6.strcmp的使用和实现
语法:
——比较字符串上对应位置的字符大小
——比较的不是字符串的长度,但反应的是字符串的比较结果
——第一个字符串大于第二个字符串,则返回大于0的数字
——第一个字符串等于第二个字符串,则返回0
——第一个字符串小于第二个字符串,则返回小于0的数字
——本质是比较两个字符串中对应位置上字符ASCII码值的大小
使用:
模拟实现:
#include <string.h> #include <stdio.h> #include <assert.h> int my_strcmp(const char*s1, const char* s2) { assert(s1 && s2); while (*s1 == *s2) //如果对应位置相等,则进行下一位的判断 { if (*s1 == '\0') { return 0;//如果进行到最后一位还相等,则返回0,表示相等 } s1++; s2++; } if (*s1 > *s2) return 1; else return -1; } int main() { int ret = my_strcmp("love", "love"); printf("%d\n", ret); return 0; }
总结:字符串函数第一篇结束,共两篇,请耐心等待下一篇哦!
作者留言:本人初学者,创作不易,如有错误或不恰当的地方,欢迎指出!
创作时间:2024.1.19