hello,大家好呀,感觉我之前有偷偷摸鱼了,今天又开始学习啦。加油!!!
文章目录
- 1. 字符分类函数
- 2. 字符转换函数
- 3. strlen的使用和模拟实现
- 3.1 strlen 的使用
- 3.1 strlen 的模拟
- 1.计算器方法
- 2.指针-指针的方法
- 3.递归的方法
- 4. strcpy的使用和模拟实现
- 5. strcat的使用和模拟实现
- 6. strcmp的使用和模拟实现
- 7. strncpy函数的使用
- 8. strncat函数的使用
- 9. strncmp函数的使用
- 10. strstr的使用和模拟实现
- 11. strtok函数的使用
- 12. strerror函数的使用
1. 字符分类函数
C语言中有一系列的函数是专门做字符分类的,且这些函数在使用时都需要包含头文件:ctype.h
这些函数的使用大同小异,我举其中的一个例子:
从上图可以看出,函数islower是用来判断是否为小写字母,我们可以在cplusplus搜索islower函数,它给出的是:如果是小写字母,则返回非0值;如果不是小写字母,则返回0.
int main()
{int c = islower('A');int q = islower('a');printf("c=%d\n", c);printf("q=%d\n", q);return 0;//打印结果是:c=0;q=2
}
练习写一个代码:将字符串中的小写字母转大写,其他字符不变。(在学习字符转换函数之后有另外一种方式,大家可以尝试一下)
#include<stdio.h>
#include<ctype.h>
int main()
{char arr[] = "I am very sad." ;int i = 0;while (arr[i] != '\0'){if (islower(arr[i])){arr[i] = arr[i] - 32;}i++;}//再将字符串输出,看是否变成大写printf("%s\n", arr);return 0;
}
2. 字符转换函数
C语言提供了2个字符转换函数:
int tolower ( int c ); ------- 转成小写--------- //将参数传进去的大写字母转小写
int toupper ( int c );------- 转成大写----------//将参数传进去的小写字母转大写
int c的意思是传入一个字符(字符的本质就是ascll码值),int tolower的意思是返回值为整数
int main()
{char ch = tolower('A');printf("%c\n", ch);char hh = toupper('a');printf("%c\n", hh);
}
之前小写转大写可以将if语句里面改掉
int main()
{char arr[] = "I am very sad." ;int i = 0;while (arr[i] != '\0'){if (islower(arr[i])){arr[i] = toupper(arr[i]);}i++;}//再将字符串输出,看是否变成大写printf("%s\n", arr);return 0;
}
3. strlen的使用和模拟实现
3.1 strlen 的使用
1.使用strlen需要包含头文件:string.h
2.字符串以’\0’ 作为结束标志。
- 比如:“abc” 其实就是‘a’ ‘b’ ‘c’ ‘\0’,一共4个字符。但是strlen只统计’\0‘之前的字符个数。(不包含’\0’)
- 如果字符数组中是char arr[]={‘a’,‘b’,‘c’};的话,则是没有\0的,什么时候遇到\0不确定。
int main()
{char arr[] = "aaattt";size_t len = strlen(arr);printf("%d\n", len);//6char qqq[]={'a','b'};size_t lee = strlen(qqq);printf("%d\n",lee);//随机值return 0;
}
3.strlen的返回值是size_t(即无符号整数)
int main()
{char ch1[] = "abc";char ch2[] = "abcdef";if (strlen(ch1) - strlen(ch2) < 0)//3 - 6{printf("ch1<ch2");}else{printf("ch1>ch2");}
}
//最终的结果是ch1>ch2
3-6=-3,小于0,为什么输出是大于?
在这里说明,strlen的返回值是size_t,无符号整数-无符号整数=还是无符号整数,所以strlen(ch1) - strlen(ch1)的结果其实>0,所以输出>。
如果非要比较,可以将strlen的返回值强制类型转换为int,(int)strlen(ch1)-(int)strlen(ch2)。或者直接比较: if (strlen(ch1) < strlen(ch2) )
3.1 strlen 的模拟
1.计算器方法
(1.) 这是最初的版本,之后优化。
size_t my_strlen(char* str)
{int count = 0;while (*str != '\0'){count++;//个数+1str++;//下一个元素的地址}return count;
}
int main()
{char ch[] = "aaaqqq";size_t len = my_strlen(ch);//传数组传的是数组名(这里代表的是数组首元素地址)printf("%d\n", len);
}
(2.)1.万一指针是空指针呢?我们先用断言判断一下
2.我们只是想遍历一遍数组的每个元素,找到\0,并不希望有人将元素修改了,所以用const修饰*ch
#include<assert.h>
size_t my_strlen(const char* str)//用指针变量来接收地址
{int count = 0;assert(str != NULL);while (*str != '\0'){count++;//个数+1str++;//下一个元素的地址}return count;
}
int main()
{char ch[] = "aaaqqq";size_t len = my_strlen(ch);//传数组传的是数组名(这里代表的是数组首元素地址)printf("%d\n", len);
}
2.指针-指针的方法
用起始地址-\0的地址=就是中间的元素个数
这几种方法int main函数里的内容都一样,之后就不再展示,只展示my_strlen函数里的内容
size_t my_strlen(const char* str)
{int count = 0;assert(str != '\0');int start = str;//这里str还是起始元素的地址while (*str != '\0'){//通过这个循环,使得str里面放的是\0的地址str++;}int end = str;return end - start;
}
3.递归的方法
size_t my_strlen(const char* str)
{if (*str != '\0')return 1 + my_strlen(str + 1);elsereturn 0;
}