在编程的过程中,我们要经常处理字符和字符串,为了方便操作字符和字符串,c语言标准库中提供的一系列库函数,接下来我们就开始学习与认识他们
1.字符分类函数
c语言中有一系列的函数是专门做字符分类的,也就是一个字符是属于什么类型的字符的
这些函数的使用需要包含一个头文件:ctype.h
用islower举例
格式:int islower (int c)
为什么后面的是int c--用整型接受的,因为传过来的是字符或者对应的ASCII值
那么我们就用整型接受
返回值也是int
如果这个字符是小写字母的话,那么返回值就是一个非0数字
如果这个字符是一个大写字符的话,那么返回值就是0
总之:如果括号内的不是小写字母,那么这个函数就会返回一个0
是小写字母就返回一个非0数字
int main() { int ret1 = islower('b');//2 printf("%d\n", ret1); int ret2 = islower('A');//0 printf("%d\n", ret2); int ret3 = islower('0');//字符0不是字母 printf("%d\n", ret3); return 0; }
int main() { int ret1 = isdigit('A');//不是数字字符就返回0 printf("%d\n", ret1); int ret2 = isxdigit('A');//A是16进制的字符--返回的就是非0值 printf("%d\n", ret2); return 0; }
//写一个代码,将字符串中的小写字母转换成大写字母,其他字符不变 int main() { char arr[] = "I am a student";//末尾隐藏\0 //需要遍历字符串--通过下标进行访问 int i = 0; while (arr[i] != '\0')//不等于'\0'就一直遍历数组,直到遇到\0就停止遍历数组 { //判断这个数组内的字符是不是小写字母 if (islower(arr[i])) //如果不是小写字母,返回值就是0,是小写字母返回值就是非0数字, //这个函数是用来判断输入的字符是不是小写字母 { //小写字母转大写字母的方法: //小写字母的ASCII-32=对应放入大写字母ASCII arr[i] = arr[i] - 32; } i++;//没有遇到'\0'就i++ } printf("%s", arr); return 0; } //小写字母转大写字母出了这个toupper函数,还可以直接通过小写字母的ASCII-32就可以进行转换了 //那么我们对上面的问题进行改造一下 int main() { char arr[] = "I am a student";//末尾隐藏\0 //需要遍历字符串--通过下标进行访问 int i = 0; while (arr[i] != '\0')//不等于'\0'就一直遍历数组,直到遇到\0就停止遍历数组 { //判断这个数组内的字符是不是小写字母 if (islower(arr[i])) //如果不是小写字母,返回值就是0,是小写字母返回值就是非0数字, //这个函数是用来判断输入的字符是不是小写字母 { //小写字母转大写字母的方法: arr[i] = toupper(arr[i]);//小写字母通过toupper这个函数转换为大写字母了 } i++;//没有遇到'\0'就i++ } printf("%s", arr); return 0; } //对于这个循环还有一种判断是不是小写字母的方法 //if(arr[i]>='a'&&arr[i]<='z') //在这个区间内的就都是小写字母了
这些字符分类函数主要是进行判断
2.字符转换函数
c语言提供两个字符转换函数
int tolower(int c);//将参数传进去的大写字母转小写
int toupper(int c);//将参数传进去的小写字母转大写
//int main() //{ // char ch = toupper('a'); // printf("%c\n", ch);//打印出来的就是A,大写的A // // //如果传进来的大写字母,那么输出的还是大写字母,不做判断 // ch = tolower('A'); // printf("%c\n", ch);//将大写字母转换为小写字母 // // // return 0; //} //小写字母转大写字母出了这个toupper函数,还可以直接通过小写字母的ASCII-32就可以进行转换了 //那么我们对上面的问题进行改造一下 int main() { char arr[] = "I am a student";//末尾隐藏\0 //需要遍历字符串--通过下标进行访问 int i = 0; while (arr[i] != '\0')//不等于'\0'就一直遍历数组,直到遇到\0就停止遍历数组 { //判断这个数组内的字符是不是小写字母 if (islower(arr[i])) //如果不是小写字母,返回值就是0,是小写字母返回值就是非0数字, //这个函数是用来判断输入的字符是不是小写字母 { //小写字母转大写字母的方法: arr[i] = toupper(arr[i]);//小写字母通过toupper这个函数转换为大写字母了 } i++;//没有遇到'\0'就i++ } printf("%s", arr); return 0; } //对于这个循环还有一种判断是不是小写字母的方法 //if(arr[i]>='a'&&arr[i]<='z') //在这个区间内的就都是小写字母了
3.strlen的使用和模拟实现
strlen格式:size_t strlen(const char * str);
统计的是\0之前的个数
strlen的返回值是size_t类型的
// //int main() //{ // char arr1[] = "abcdef"; // size_t len=strlen(arr1);//输出的数据是6 // printf("%zd\n", len); // // // char arr2[] = { 'a','b','c','d','e','f' };//这里面是没有\0的 // size_t len1 = strlen(arr2); // printf("%zd\n", len1);//输出数据是17 // return 0; //} //注意函数的返回值是sizeof_t,是无符号的 int main() { if (strlen("abc") - strlen("abcdef") > 0) //另一种写法:if(strlen("abc")>strlen("abcdef")) {// size_t类型 size_t类型 printf(">\n"); } else { printf("<=\n"); } return 0; } //输出的结果是>,为什么呢? //当两个无符号整型进行计算的时候,算出来的结果还是无符号整型的结果 //如果想得到-3的话,那么我们需要将strlen("abc")和strlen("abcdef")强制类型转换为int 类型的数据
strlen的,模拟实现的三种方法
1.计数器的方法
2.指针~指针
size_t my_strlen(const char*str)//返回类型是sizeof_t,因为传过来的是字符串首元素的地址,那么我们用一个字符指针进行接收 {//前面加上const防止被修改 //利用传过来的首元素的地址,我们遍历数组,统计\0之前的元素个数 //只要不是\0就统计一个数字 int count = 0; //因为str是指针变量,为了防止str是空指针,我们要进行断言一下 assert(str != NULL);//如果str为空指针就报错 while (*str != '\0') { count++; str++;//使指针++,向后走一步 } return count; } int main() { char arr[] = "abcdef"; size_t len = my_strlen(arr);//自己创建一个函数来实现strlen函数 //传过去一个数组名,字符串首元素的地址 printf("%zd\n", len); return 0; }
//第二种方法:指针-指针 //两个指针相减就能得到两个指针之间的元素个数了 size_t my_strlen(const char* str) { char* start = str; assert(str != NULL); while (*str != '\0') { str++;//走到'\0'前面就停止了,那么到最后str的值是最后一个元素的地址 } return str - start;//因为一开始将第一个元素的地址赋值给start了,那么现在指针相减,得到的就是两个指针之间的元素的个数了 } int main() { char arr[] = "abcdef"; size_t len = my_strlen(arr);//自己创建一个函数来实现strlen函数 //传过去一个数组名,字符串首元素的地址 printf("%zd\n", len); return 0; }
//这种写法可以不创建临时变量 //使用递归来实现 size_t my_strlen(const char* str) { if (*str != '\0') { return 1 + my_strlen(str + 1); } else { return 0; } } int main() { char arr[] = "abcdef"; size_t len = my_strlen(arr);//自己创建一个函数来实现strlen函数 //传过去一个数组名,字符串首元素的地址 printf("%zd\n", len); return 0; }
C语言----字符函数和字符串函数(2)https://developer.aliyun.com/article/1544414