目录

🔥个人主页:************@草莓熊Lotso的个人主页****************
🎬作者简介:C++研发方向学习者
📖个人专栏:************《C语言》****************
⭐️人生格言:生活是默默的坚持,毅力是永久的享受。
一.字符分类函数
1.1--字符分类函数的理解
--C语言中有一系列函数是专门做字符分类的,也就是一个字符是属于什么类型的字符的。
这些函数的使用都需要包含头文件ctype.h

1.2--字符分类函数的使用
这些函数的使用方法十分类似,在这里以一个函数为例,其它的都很类似:
- int islower ( int c );
islower是用来判断参数部分的C是不是大小写的,通过返回值来说明是不是小写字母,如果是就返回非零整数,如果不是就返回0;
练习:
写一个代码,将字符串中的小写字符全部转为大写,其它字符不变。
cpp
#include<stdio.h>
#include<ctype.h>
int main()
{
int i = 0;
char arr[] = "I am a GENIUS";
while (arr[i])
{
if (islower(arr[i]))
arr[i] -= 32;//小写字母和大写字母的Ascll码值差32
printf("%c", arr[i]);
i++;
}
return 0;
}
二.字符转换函数
2.1--字符转换函数的理解
--C语言提供了2个字符转换函数:(也需要包含头文件ctype.h)
- int tolower ( int c ); *//*将参数传进去的大写字母转小写
*2.*int toupper ( int c ); *//*将参数传进去的小写字母转大写
上面我们将小写转大写,是利用了小写字母和大写字母的Ascll码值差32的性质,有了转换函数,就可以直接使用toupper函数实现小写转大写了。
2.2--字符转换函数的使用
练习:
写一个代码,利用字符转换函数将字符串中的小写字符全部转为大写,其它字符不变。
cpp
#include<stdio.h>
#include<ctype.h>
int main()
{
int i = 0;
char arr[] = "I am a GENIUS";
while (arr[i])
{
if (islower(arr[i]))
arr[i]=toupper(arr[i]);
printf("%c", arr[i]);
i++;
}
return 0;
}
三.strlen的使用和模拟实现
- size_t strlen ( const char * str );
**功能:**统计参数str指向的字符串的长度,统计的是字符串中 '\0' 之前的字符的个数。
**参数:**str指针,指向了要统计长度的字符串。
**返回值:**返回了str指向的字符串的长度,返回的长度不会是负数,所以返回类型是size_t。
3.1--strlen的使用演示
cpp
#include<stdio.h>
#include<string.h>
int main()
{
const char* str = "abcdef";
printf("%zd\n", strlen(str));//6
return 0;
}
使用注意事项:
- 字符串以 '\0' 作为结束标志,strlen函数返回的是在字符串中 '\0' 前面出现的字符个数(不包
- 含 '\0' )。
- 参数指向的字符串必须要以 '\0' 结束。
- 注意函数的返回值为 size_t,是无符号的( 易错 )
- strlen的使用需要包含头文件<string.h>
3.2--strlen的返回值
--strlen函数的返回值为 size_t,是无符号的( 易错 ),那为什么说它易错呢,我们来通过一串代码直观了解一下吧
cpp
#include <stdio.h>
#include <string.h>
int main()
{
const char* str1 = "abcdef";
const char* str2 = "bbb";
if (strlen(str2) - strlen(str1) > 0)
{
printf("str2>str1\n");
}
else
{
printf("srt2<str1\n");
}
return 0;
}
错误理解:按一般的想法来说,strlen(str2)-strlen(str1)应该是-3,小于0,所以打印srt2<str1,但是其实不是,我们来看看运行的结果:

我们会发现结果是str2>str1,这正是因为strlen函数的返回类型是size_t类型,始终大于0,strlen(str2)-strlen(str1)的结果也是size_t类型的,所以也是大于0,直接打印出str2>str1。不过改成strlen(str2)>strlen(str1)就会打印出srt2<str1了。当然也有别的理解方法,这里就不多讲了。
3.3--strlen的模拟实现
方法1:
cpp
//用计数器的方法
#include<stdio.h>
#include<assert.h>
size_t mystrlen(const char* str)
{
int count = 0;
assert(str!=NULL);
while (*str)
{
count++;
str++;
}
return count;
}
int main()
{
char arr[] = "abcdef";
size_t ret = mystrlen(arr);
printf("%d", ret);
return 0;
}
方法2:
cpp
//用指针减指针
#include<stdio.h>
#include<assert.h>
size_t mystrlen(char* str)
{
assert(str != NULL);
char* p = str;
while (*p)
{
p++;
}
return p - str;
}
int main()
{
char arr[] = "abcdef";
size_t ret = mystrlen(arr);
printf("%d", ret);
return 0;
}
方法三:
cpp
//不创建临时变量,用递归做
#include<stdio.h>
#include<assert.h>
size_t mystrlen(const char* str)
{
assert(str != NULL);
if (*str == '\0')
{
return 0;
}
else
{
return 1 + mystrlen(str + 1);
}
}
int main()
{
char arr[] = "abcdef";
size_t ret = mystrlen(arr);
printf("%d", ret);
return 0;
}
四.strcpy的使用和模拟实现
- char * strcpy (char * destination, const char * source );
**功能:**字符串拷贝,将源头的字符串拷贝到目标空间中,拷贝到源头字符串中的 '\0' 为止。
参数: destination指针,指向目的地空间;source指针,指向源头数据。
**返回值:**strcpy函数返回的目标空间的起始地址。
4.1--strcpy的使用演示
cpp
#include <stdio.h>
#include <string.h>
int main()
{
char arr1[20] = { 0 };
char arr2[] = "hello";
char*p=strcpy(arr1, arr2);
printf("%s\n", p);
printf("%s\n", arr1);
//两种打印方式都可以
return 0;
}
使用注意事项:
- 源字符串必须以 '\0' 结束。
- 会将源字符串中的 '\0' 拷贝到目标空间。
- 目标空间必须足够大,以确保能存放源字符串,[ ]里不能为空。
- 目标空间必须可修改,比如用char*p="xxxxxxxxxxxx"就不行,无法修改
4.2--strcpy的模拟实现
cpp
#include<stdio.h>
#include<assert.h>
char* mystrcpy(char* arr1, const char* arr2)
{
assert(arr1&&arr2);
char* p = arr1;
while ((*arr1++ = *arr2++))
{
;
}
return p;
}
int main()
{
char arr1[20] = "xxxxxxxxxxxxxx";
char arr2[] = "abcdef";
char* ret = mystrcpy(arr1, arr2);
printf("%s", ret);
return 0;
}
//1.参数顺序
//2.函数的功能,停⽌条件
//3.assert
//4.const修饰指针
//5.函数返回值
//6.题⽬出⾃《⾼质量C/C++编程》书籍最后的试题部分
五.strcat的使用和模拟实现
- char * strcat (char * destination, const char * source );
**功能:**字符串追加,把source指针的源字符串中的所有字符都追加到destination指向的空间中。
**参数:**destination指针,指向目的地空间;source指针,指向源头数据。
**返回值:**strcat函数返回的目标空间的起始地址。
5.1--strcat的使用演示
cpp
#include <stdio.h>
#include <string.h>
int main()
{
char arr1[20] = "hello";
char arr2[] = "world";
char* p = strcat(arr1, arr2);
printf("%s\n", p);
printf("%s\n", arr1);
//两种打印方式都可以
return 0;
}
使用注意事项:
- 源字符串必须以 '\0' 结束。
- 目标字符串中也得有 \0 ,否则没办法知道追加从哪里开始。
- 目标空间必须有足够的大,能容纳下源字符串的内容,[ ]里不能为空。
- 目标空间必须可修改,比如用char*p="hello"就不行,无法修改
5.2--strcat的模拟实现
cpp
#include<stdio.h>
#include<assert.h>
char* mystrcat(char* arr1, const char* arr2)
{
assert(arr1 && arr2);
char* p = arr1;
while (*arr1)
{
arr1++;
}//找到目标字符串中的\0,明确从那里开始追加。
while ((*arr1++ = *arr2++))
{
;
}
return p;
}
int main()
{
char arr1[20] = "hello";
char arr2[] = "world";
char* ret = mystrcat(arr1, arr2);
printf("%s", ret);
return 0;
}
往期回顾节选:
【C语言指针超详解(六)】--sizeof和strlen的对比,数组和指针笔试题解析,指针运算笔试题解析
结语:本篇文章就到此结束了,继前面几篇文章后,在此篇文章中给大家分享了字符分类函数,字符转换函数,strlen,strcpy,strcat函数的使用和模拟实现等知识点,后续会继续分享字符函数和字符串函数的相关知识点,如果文章对你有帮助的话,欢迎评论,点赞,收藏加关注,感谢大家的支持。