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);//6
char 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++;//个数+1
str++;//下一个元素的地址
}
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++;//个数+1
str++;//下一个元素的地址
}
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);
else
return 0;
}