本章概述
- 字符分类函数
- 字符转换函数
- strlen的使用和模拟实现
- strcpy的使用和模拟实现
- strcat的使用和模拟实现
- strcmp的使用和模拟实现
- 彩蛋时刻!!!
字符分类函数
- 字符: 这个概念,我们在以前的文章中讲过了。我们键盘输入的信息都是字符。字符大体可以分为两类——单个字符,字符串。而单个字符又可以进行分类——字母字符,数字字符,特殊字符和不可见字符。进行思维图展示:
在日常生活中,我们写的字符也就是随便写,比如,123,abc……
。但在C语言中,为了识别出字符和字符串,我们就要用两个操作符——' '
和" "
。' '
是用来识别单个字符的," "
是用来识别字符串的。
我们对于所写的字符,我们人都能识别出来。A我们能识别它是大写,a我们能识别它是小写,1我们能识别它是数字。但是,计算机是无法识别出来的,所以,为了能够让计算机识别,我们就创建了字符分类函数。我们进行展示:
它们的头文件是:<ctype.h>
,当条件为真时,就会返回大于0
的数值,反之返回小于0
的数值。这些字符分类函数的用法都是相同,所以我们举一个就行了(常用的),比如,islower
判断是否小写的函数。我们先来看它的类型和参数:
// int islower (int c)
进行代码展示:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <ctype.h>
int main()
{
int c = islower('a');
int b = islower('A');
if (c > 0)
printf("%c是小写\n", 'a');
else
printf("%c是大写\n", 'a');
if (b > 0)
printf("%c是小写\n", 'A');
else
printf("%c是大写\n", 'A');
return 0;
}
结果运行图:
对于其它字符分类函数的使用,大家可以点击连接进行学习使用:https://cplusplus.com/reference/clibrary/
字符转换函数
C语言中就俩字符转换函数,它们的头文件是 <ctype.h>,如下:
// 大写转小写:int tolower (int c)
// 小写转大写:int toupper (int c)
进行代码展示:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <ctype.h>
#include <string.h>
int main()
{
int c = toupper('a'); //转大写
printf("%c\n", c);
int b = tolower('A'); //转小写
printf("%c\n", b);
return 0;
}
结果运行图:
我们来写个程序,运用我们所学的知识:
// 我们写一句英文,然后,把我们所写的英文全部转换为大写,比如:
// I am a student.-------> I AM A STUDENT.
// 我们来写两个方法进行实现。
程序【1】
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <ctype.h>
#include <string.h>
int main()
{
char arr[] = "I am a student.";
int sz = sizeof(arr) / sizeof(arr[0]);
int i = 0;
printf("转换前:%s\n", arr);
for (i = 0; i < sz; i++)
{
if (islower(arr[i]))
arr[i] = arr[i] - 32; //大写字母的AS||值比小写字母的AS||值少32
}
printf("转换后:%s\n",arr);
return 0;
}
结果运行图:
程序【2】。
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <ctype.h>
int main()
{
char arr[] = "I am a student.";
int sz = sizeof(arr) / sizeof(arr[0]);
int i = 0;
printf("转换前:%s\n", arr);
for (i = 0; i < sz; i++)
{
if(islower(arr[i]))
arr[i]=toupper(arr[i]); //使用 toupper进行转换
}
printf("转换后:%s\n",arr);
return 0;
}
结果运行图:
大家也可以进行举一反三,比如,大写转小写代码。
strlen的使用和模拟实现
- strlen的使用:后面,我们要开始讲字符串相关的函数了,它们的头文件<string.h>。前面,咱们已经讲过了
strlen
的使用和模拟实现,今天在复习一下。我们知道,每个字符串后面都会自动补\0
,strlen
统计的是\0
之前的字符串的长度。进行代码展示:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
int main()
{
char arr[] = "abcdef";
printf("%zd", strlen(arr));
return 0;
}
结果运行图:
对于strlen
的返回值打印最好要用%zd
。因为strlen
的返回值类型为size_t(无符号整形),关于为什么是size_t的类型
,咱们在以前的文章中讲过了。
我们还可以指定它的统计起始位置,进行代码展示:下面展示一些 内联代码片
。
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
int main()
{
char arr[] = "abcdef";
printf("%zd", strlen(arr+1)); //从b开始进行统计,所以统计数为:5.
return 0;
}
结果运行图展示:
- strlen的模拟:
// 咱们写三种方法进行实现。
// 思路:统计\0之前的字符数。
方法【1】----计数器的方式
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
size_t my_strlen(char arr[])
{
int count = 0;
int i = 0;
while (arr[i])
{
count++;
i++;
}
return count;
}
int main()
{
char arr[] = "abcdef";
printf("%zd\n", my_strlen(arr));
return 0;
}
结果运行图:
方法【2】----指针-指针
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
size_t my_strlen(char arr[])
{
char*s1=arr;
while (*arr)
{
arr++;
}
return arr-s1;
}
int main()
{
char arr[] = "abcdef";
printf("%zd\n", my_strlen(arr));
return 0;
}
结果运行图:
方法【3】----递归函数
进行如图所示的逻辑:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
size_t my_strlen(char arr[])
{
if (*arr)
{
arr++;
return 1 + my_strlen(arr);
}
else
return 0;
}
int main()
{
char arr[] = "abcdef";
printf("%zd\n", my_strlen(arr));
return 0;
}
结果运行图:
在这三种方法都很好,都是使用了我们所学过的知识,大家要掌握。
strcpy的使用和模拟实现
- strcpy的使用: 具有拷贝字符串的功能。比如,A字符串拷向B字符串,B字符串拷向A字符串,自己向自己拷贝。 我们来看它的结构组成:
// char * strncpy ( char * destination, const char * source );
| | |
| | |
| | |
返回的是des的地址(未更改前的) 目的地的地址 拷贝源的地址
// 因为我们不想拷贝来源的时候,发生更改,所以用const修饰。
- 它的使用有几个要注意的点:
- 1.拷贝的来源必须以
' \0'
结尾。 - 2.dest的空间要足够大,要容的下要拷贝的内容。
- 3.des的空间是要可修改的,要不然就无法拷贝。
- 4 .拷贝的时候,也会把source的
' \0'
拷贝过去。 - 5.拷贝的起始位置是可以指定的(des和source都可以指定起始位置,指定的方式和strlen一样)
- 1.拷贝的来源必须以
- 进行代码展示:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
int main()
{
char arr[] = "abcedf";
char arr1[30]={0};
printf("拷贝前arr1:%s\n",arr1);
printf("拷贝后arr1:%s\n", strcpy(arr1, arr));
return 0;
}
结果运行图:
- strcpy的模拟实现:
// 遇到source的' \0'就会拷贝停止,但也要把' \0'拷贝过去
进行代码展示:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
#include <assert.h>
char* my_strcpy(char* des, const char* str)
{
char* p = des; //因为经过后面的程序后,des的值早变了,所以要先给cpy一份
assert(des && str); //判断一下,des和str是否为空指针
while (*des++=*str++)
{
;
}
return p;
}
int main()
{
char arr[] = "abcedf";
char arr1[30] = {0};
printf("拷贝前arr1:%s\n",arr1);
printf("拷贝后arr1:%s\n", my_strcpy(arr1, arr));
return 0;
}
结果运行图:
strcat的使用和模拟实现
- strcat的使用:它具有在字符串的后面补上别的字符串的功能。比如:
// char arr[30]="abd" ;
// char arr1[4]="acd" ;
// arr1向arr的末尾补齐------->"abdacd"
- 它的结构所示:
// char * strcat(char *dest, const char*src)
// 返回值和每个参数的意思和strcpy是一样的
- 它的使用要注意的点:
- 1.
src
会找到des
的第一个出现的' \0'
,在此处把src
的字符串补充到des
中(此时的’ \0’会被覆盖)。 - 2 .由于des的’ \0’被覆盖了,所以str在补充字符串后,会在末尾添加’\0’。(占别人的东西,最后肯定要还的!)
- 3.des的空间要够大,要容得下补充后的字符空间。
- 4 .补充的起始位置是可以指定的(des和str都可以指定起始位置,指定的方式和strlen一样)
- 1.
- 进行代码展示:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
#include <assert.h>
int main()
{
char arr[30] ="abcdef";
char arr1[] = "xxx";
printf("%s\n", strcat(arr, arr1));
return 0;
}
结果运行图:
- strcat的模拟实现:思路:我们要找到des的’\0’, 才能进行补充。进行代码展示:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
#include <assert.h>
char* my_strcat(char* des, const char* str)
{
char* p = des;
assert(des && str);
while (*des)
des++;
while (*des++=*str++)
{
;
}
return p;
}
int main()
{
char arr[30] ="abcdef";
char arr1[] = "xxx";
printf("%s\n", my_strcat(arr, arr1));
return 0;
}
结果运行图:
strcmp的使用和模拟实现
- strcmp的使用:是用来比较字符串的大小的。它比较的可不是两个字符串的长度大小,比较的是每单个字符的大小(就是比较两个单个字符的AS||值的大小)。结构组成如下:
// int strcmp (const char * str1, const char * str2)
- 要注意的几点:
- 1.比较的顺序就是所输入的数据,比如,输入顺序:str1 ,str2。 比较顺序:str1 ,str2。 输入顺序:str2 ,str1。 比较顺序:str2 ,str1。
- 2 .str1 > str2就会返回大于0的数值。str1<str2就会返回小于0的值。str1=str2就会返回0。
- 3.因为我们要比较两个字符串的大小,所比较的内容不能被更改,所以参数要用const修饰。
- 4 .比较的起始位置是可以指定的(str1和str2都可以指定起始位置,指定的方式和strlen一样)
- 进行代码展示:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
#include <assert.h>
int main()
{
char arr[30] ="abcdef";
char arr1[] = "abx";
printf("%d\n", strcmp(arr, arr1));
return 0;
}
结果运行图:
大家可自行试一下,对于和等于的代码。
- strcmp的模拟实现:比较的AS||值的大小,进行代码展示:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <assert.h>
#include <string.h>
int my_strcmp(const char* e1, const char* e2)
{
while (*e1 == *e2)
{
e1++;
e2++;
if (*e1 == '\0' || *e2 == '\0')
break;
}
return *(int*)e1 - *(int*)e2;
}
int main()
{
char arr[30] = "abcdef";
char arr1[] = "abx";
printf("%d\n", my_strcmp(arr, arr1));
return 0;
}
结果运行图:
彩蛋时刻!!!
https://www.bilibili.com/video/BV1Ze4y1F7CV/?spm_id_from=333.337.search-card.all.click
每章一句:总有人翘首以盼为你而来。
感谢你能看到这里,点赞+关注+收藏+转发是对我最大的鼓励,咱们下期间!!!