回调函数,字符函数,字符串函数

前言:上一趴我们学习了指针。那么今天我们来学习新的知识,回调函数,字符函数,字符串函数。

1 回调函数

什么是回调函数呢?回调函数就是通过函数指针调用的函数

如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,被调用的函数就是回调函数

2 qsort函数

在这里插入图片描述

在这里插入图片描述

//采用快排的思想,可以排序任意类型的数据
void qsort (void* base,//指向的是一个待排序数组中第一个对象的地址size_t num,//base指向的数组中元素的个数size_t size,//待排序数组中每个元素的大小,单位是字节int (*compar)(const void* p1,const void* p2));//指向了一个比较两个元素的函数,//这个比较函数的返回类型是int,参数的类型是const void*//如果p1指向的元素大于p2指向的元素,返回大于0的数字//如果p1指向的元素等于p2指向的元素,返回等于0的数字//如果p1指向的元素小于p2指向的元素,返回小于0的数字

接下来我们简单的应用一下qsort函数来排序一个整型数组。

#include<stdio.h>
#include<stdlib.h>
//比较函数
int cmp_int(const void* p1, const void* p2)
{//void*类型的指针不能直接解引用,先进行强制类型转换再解引用return *(int*)p1 - *(int*)p2;
}
int main()
{int arr[10] = { 0 };//求取数组大小int sz = sizeof(arr) / sizeof(arr[0]);int i = 0;//从标准输入设备上输入数据for (i = 0; i < sz; i++){scanf("%d", &arr[i]);}//对arr数组进行排序,默认是升序排序qsort(arr, sz, sizeof(int), cmp_int);for (i = 0; i < sz; i++){printf("%d ", arr[i]);}return 0;
}

那我们要如何对结构体数据进行排序呢?这个时候就体现出了qsort函数的重要性了。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
//定义一个结构体
struct stu
{char name[20];//名字int age;//年龄
};
//通过名字进行比较
int cmp_by_name(const void* p1, const void* p2)
{//	字符串的比较要使用strcmp函数,包含头文件string.hreturn strcmp(((struct stu*)p1)->name, ((struct stu*)p2)->name);
}
int main()
{//结构体数组,进行初始化struct stu s[3] = { "zhangsan",20,"wangwu",18,"lisi",25 };//结构体的大小int sz = sizeof(s) / sizeof(s[0]);//对结构体数据进行排序qsort(s, sz, sizeof(struct stu), cmp_by_name);int i = 0;for (i = 0; i < sz; i++){printf("%s,%d\n", s[i].name,s[i].age);}return 0;
}

3 qsort函数的模拟实现

#include<stdio.h>
int cmp_int(const void* p1, const void* p2)
{return *(int*)p1 - *(int*)p2;//这里是以整型数组为例,所以强转//成了int*
}
void swap(char* buf1, char* buf2, size_t width)
{int i = 0;for (i = 0; i < width; i++)//一个字节一个字节交换{char tmp = *buf1;*buf1 = *buf2;*buf2 = tmp;buf1++;buf2++;}
}
void bubble_sort(void* base, //使用void*类型的指针可以接收任意类型
//变量的地址,有可能排序整型类型,也可以排序结构体类型size_t num, //待排序数组元素的个数size_t size, //待排序数组每个元素的大小,单位是字节int(*cmp)(const void* p1, const void* p2))//这是一个指向比较两//个元素大小的函数指针
{int i = 0;//趟数for (i = 0; i < num - 1; i++){int j = 0;//每趟需要比较的次数for (j = 0; j < num - 1 - i; j++){//此时这里是用函数指针调用其所指向的函数,cmp_int就是回调函数//为了实现排序的通用,我们对其进行char*类型的强制转换,//(char*)base+j*width,(char*)base+(j+1)*width是需要比较两个元素的起始地址,通过函数指针cmp去调用比较函数if (cmp((char*)base + j * size, (char*)base + (j + 1) * size) > 0){//交换元素的函数,size是为了决定要交换字节的个数同//时也是每个元素的大小,单位是字节swap((char*)base + j * size, (char*)base + (j + 1) * size, size);}}}
}
void print(int arr[], int sz)
{int i = 0;for (i = 0; i < sz; i++){printf("%d ", arr[i]);}
}
int main()
{int arr[10] = { 6,5,2,3,1,9,7,8,10,4 };//求取数组的大小int sz = sizeof(arr) / sizeof(arr[0]);//模拟qsort函数bubble_sort(arr, sz, sizeof(int), cmp_int);//升序//打印数组print(arr, sz);return 0;
}

4 sizeof和strlen的对比

. sizeof是一个操作符也是一个关键字。计算的是变量所占内存空间的大小,单位是字节。如果操作数是类型的话,计算的是使用类型创建的变量所占内存空间的大小

sizeof只关注占用内存空间的大小,不关注存放什么数据

. strlen是一个库函数,功能是求取字符串的长度

size_t strlen(const char* str);

统计的是从strlen函数的参数str中这个地址开始向后,\0之前字符串中字符的个数。strlen函数会一直向后找\0字符,直到找到为止。所以可能会存在数组越界

5 字符分类函数

这些函数都需要包含头文件ctype.h

在这里插入图片描述

所有控制字符
在这里插入图片描述

这些函数都是非常简单且类似的一些库函数,我们简单举两个函数体验一下。

#include<stdio.h>
#include<ctype.h>
int main()
{if(iscntrl('\t')){printf("控制字符\n");}return 0;
}

在这里插入图片描述

在这里插入图片描述

#include<stdio.h>
#include<ctype.h>
int main()
{if (isspace(' ')){printf("空格字符\n");}return 0;
}

在这里插入图片描述

在这里插入图片描述

6 字符转换函数

int tolower(int c);//转换成小写字符
int toupper(int c);//转换成大写字符

上实战,将字符串中的小写字符转换成大写字符。

#include<stdio.h>
#include<ctype.h>
#include<string.h>
int main()
{char ch[] = "WelCome to ChinA";size_t len = strlen(ch);//字符串的长度char* pch = ch;//字符指针存储字符数组首字符的地址while (len){//islower判断字符是不是小写字母,条件为真返回非0的值,为假//返回0if (islower(*pch)){//toupper小写字母转换大写字母*pch = toupper(*pch);}pch += 1;len--;}printf("%s\n", ch);return 0;
}

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

7 strlen的使用和模拟实现

strlen函数的功能是求取字符串中\0之前字符的个数。返回值类型是size_t类型(无符号)。strlen的使用需要包含头文件string.h

size_t strlen(const char* str);
#include<stdio.h>
#include<string.h>
int main()
{char ch[20] = "hello world";size_t len = strlen(ch);printf("%zd\n", len);return 0;
}

简单了解了strlen的使用,接下来让我们模拟实现strlen函数。

#include<stdio.h>
#include<assert.h>
size_t my_strlen(char* pch)
{assert(pch!=NULL);char* start = pch;//记录字符串的起始地址while (*pch){pch++;}return pch - start;//指针-指针
}
int main()
{char ch[20] = "welcome to china";size_t len = my_strlen(ch);printf("%zd\n", len);return 0;
}

利用这段代码回顾一下以前的知识。指针-指针的绝对值计算的是元素的个数。利用strlen函数的特性,以\0为字符串结束标志同时作为循环的结束条件。开始记录下字符串的起始地址防止指针pch后续使用时起始地址丢失

在这里插入图片描述

除了指针-指针之外,还有其他方法。例如递归实现。

#include<stdio.h>
#include<assert.h>
int my_strlen(char* pch)
{assert(pch!=NULL);if (*pch == '\0'){return 0;}else{return 1 + my_strlen(pch + 1);}
}
int main()
{char ch[20] = "welcome to china";int len = my_strlen(ch);printf("%d\n", len);return 0;
}

画图分析:
在这里插入图片描述

现在我们应该对strlen函数有了更深层次的理解,那么让我们来看下面的一段代码。

#include <stdio.h>
#include <string.h>
int main()
{const char* str1 = "abcdef";const char* str2 = "bbb";//    3              6//strlen返回值类型是size_t类型,是一个unsigned int类型//-3会被当做一个无符号的整数//10000000000000000000000000000011原码//11111111111111111111111111111100反码//11111111111111111111111111111101补码,最高位不再是符号位,被当做数值位,是一个非常大的整数if (strlen(str2) - strlen(str1) > 0){printf("str2>str1\n");}else{printf("srt1>str2\n");}return 0;
}

在这里插入图片描述

结果是否和小伙伴们想的一样呢?

8 strcpy的使用和模拟实现

char* strcpy(char* destination,const char* source);

注意

. 源字符串必须以\0结尾

. 会将源字符串中的\0拷贝进目标空间

. 目标空间必须足够大,以确保能存放源字符串

. 目标空间必须是可修改的

#include<stdio.h>
#include<string.h>
int main()
{char ch1[30] = { 0 };char ch2[20] = "welcome to china";char* start = strcpy(ch1, ch2);printf("%s\n", start);return 0;
}

模拟实现strcpy。

#include<stdio.h>
#include<assert.h>
char* my_strcpy(char* pch1, const char* pch2)
{assert(pch1 && pch2);char* start = pch1;//记录pch1的起始地址while (*pch1++ = *pch2++)//先将pch2里的内容赋值给pch1再判断是//否满足循环条件{;}return start;//返回pch1的起始地址
}
int main()
{char ch1[30] = { 0 };char ch2[20] = "hello world";char* ret = my_strcpy(ch1, ch2);printf("%s\n", ret);return 0;
}

9 strcat的使用和模拟实现

char * strcat ( char * destination, const char * source );

注意

. 源字符串必须以\0结尾

. 目标字符串也必须以\0结束,否则不知道从哪里开始追加

. 目标空间必须是可修改的

. 目标空间必须足够大,能够容纳源字符串中的内容

#include<stdio.h>
#include<string.h>
int main()
{char ch1[30] = "hello everyone ";char ch2[20] = "good morning";char* start = strcat(ch1, ch2);printf("%s\n", start);return 0;
}

模拟实现strcat。

#include<stdio.h>
#include<string.h>
#include<assert.h>
char* my_strcat(char* dest, char* src)
{char* start = dest;//记录目标空间的起始地址assert(dest && src);while (*dest)//找到目标空间\0处的地址{dest++;}while (*dest++ = *src++)//从目标空间\0处的地址开始追加{;}return start;
}
int main()
{char ch1[30] = "hello everyone ";char ch2[20] = "good morning";char* ret = my_strcat(ch1, ch2);printf("%s\n", ret);return 0;
}

不建议使用strcat函数自己给自己追加。

10 strcmp的使用和模拟实现

int strcmp(const char* str1,const char* str2);

标准规定

第一个字符串大于第二个字符串,返回大于0的数字

第一个字符串等于第二个字符串,返回0

第一个字符串小于第二个字符串,返回小于0的数字

那么如何判断两个字符串的大小呢?比较两个字符串对应位置字符ASCII码值的大小。

#include<stdio.h>
#include<string.h>
int main()
{char str1[20] = "hello world";char str2[20] = "hello china";int ret = strcmp(str1, str2);if (ret > 0){printf("str1>str2\n");}else if (ret == 0){printf("str1=str2\n");}else{printf("str1<str2\n");}return 0;
}

模拟实现strcmp。

#include<stdio.h>
#include<assert.h>
int my_strcmp(char* p1, char* p2)
{assert(p1 && p2);while (*p1==*p2)//p1指向的内容等于p2指向的内容,就比较下一对内//容{//如果两个字符串相等,返回0if (*p1 == '\0'){return 0;}p1++;p2++;}return *p1-*p2;
}
int main()
{char str1[10] = "abcdef";char str2[10] = "abcdghi";int ret = my_strcmp(str1, str2);if (ret > 0){printf("str1>str2\n");}else{printf("str1!=str2\n");}return 0;
}

11 strncpy的使用

char* strncpy(char* destination,const char* source,size_t num);
//拷贝num个字符从源字符串到目标空间
//如果源字符串的长度小于num个字符,则拷贝完源字符串之后在目标的后边追加
//0直到num个字符
#include<stdio.h>
#include<string.h>
int main()
{char str1[10] = "good";char str2[10] = "morning";char* ret = strncpy(str1, str2, 7);printf("%s\n", ret);return 0;
}

12 strncat的使用

char* strncat(char* destination,const char* source,size_t num);
//将source指向的字符串前num个字符追加到destination指向的字符串末尾,再追
//加一个\0字符
//如果source指向字符串的长度小于num个字符,只会将字符串中\0之前的字符追
//加到destination指向的字符串末尾
#include<stdio.h>
#include<string.h>
int main()
{char str1[20] = "hello ";char str2[20] = "world";char* ret = strncat(str1, str2, 6);printf("%s\n", ret);return 0;
}

13 strncmp的使用

int strncmp(const char* str1,const char* str2,size_t num);
//比较str1和str2字符串中前num个字符,如果相等就继续向后比较,最多比较num
//个字母,如果提前发现不一样,就提前终止。
#include<stdio.h>
#include<string.h>
int main()
{char str1[20] = "hello everyone ";char str2[20] = "hello world";int ret = strncmp(str1, str2, 5);if (ret > 0){printf("str1>str2\n");}else if (ret == 0){printf("str1=str2\n");}else{printf("str1<str2\n");}return 0;
}

在这里插入图片描述

14 strstr函数的使用和模拟实现

char* strstr(const char* str1,const char* str2);
//函数返回字符串str2在字符串str1中第一次出现的位置
//字符串的比较不包含\0字符,以\0作为结束标志
#include <stdio.h>
#include <string.h>
int main()
{char str[] = "This is a simple string";char* pch = strstr(str, "simple");strncpy(pch, "sample", 6);printf("%s\n", str);return 0;
}

模拟实现strstr。

#include<stdio.h>
#include<assert.h>
char* my_strstr(char* str1, char* str2)
{assert(str1 && str2);char* s1 = str1;//用来遍历字符串char* s2 = str2;//用来遍历字符串char* cur = str1;//记录可能开始匹配的位置if (*str2 == '\0'){return str1;}while (*cur){//完成一次匹配s1 = cur;s2 = str2;while (*s1 && *s2 && *s1 == *s2){s1++;s2++;}if (*s2 == '\0'){return cur;}cur++;}return NULL;
}
int main()
{char str1[20] = "abbbcdef";char str2[20] = "bbc";char* ret = my_strstr(str1, str2);printf("%s\n", ret);return 0;
}

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

15 strtok函数的使用

char* strtok(char* str,const char* sep);
//sep参数指向了一个字符串,定义了用作分隔符的字符集合
//第一个参数指定一个字符串,它包含了0个或者多个由sep字符串中一个或者多个分隔符分割的标记
//strtok函数找到str中的下一个标记,并将其用\0结尾,返回一个指向这个标记的指针
//strtok函数会改变原字符串的内容,所以在使用strtok函数切分的字符串一般都是临时拷贝的内容
//strtok函数的第一个参数不为NULL,函数将找到str中第一个标记,strtok函数将保存它在字符串中的位置
//strtok函数的第一个参数为NULL,函数将在同一个字符串中被保存的位置开始,查找下一个标记
//如果字符串中不存在更多标记,返回NULL
#include<stdio.h>
#include<string.h>
int main()
{char str[] = "https:csdn.net";char sep[] = ":.";char str1[30] = { 0 };strcpy(str1, str);char* p = NULL;for (p = strtok(str1, sep); p != NULL; p = strtok(NULL, sep)){printf("%s\n", p);}printf("%s\n", p);return 0;
}

16 strerror函数的使用

char* strerror(int errnum);
//strerror函数可以把参数部分错误码对应的错误信息的字符串地址返回来
//一般是放在errno.h这个头文件中说明的,程序启动时会使用一个全局变量errno来记录程序的当前错误码,
//只不过程序启动的时候errno=0,表示没有错误,发生错误的时候,会将对应的错误码放在errno中
#include<stdio.h>
#include<errno.h>
#include<string.h>
int main()
{FILE* pf = fopen("test.txt", "r");if (pf == NULL){printf("%s\n", strerror(errno));return 1;}//打开成功//关闭文件fclose(pf);pf = NULL;return 0;
}
perror函数直接将错误信息打印出来。perror函数打印完参数部分的字符串后,再
//打印一个冒号和空格,再打印错误信息
#include<stdio.h>
#include<errno.h>
#include<string.h>
int main()
{FILE* pf = fopen("test.txt", "r");if (pf == NULL){perror("文件打开失败的原因是");return 1;}//打开成功//关闭文件fclose(pf);pf = NULL;return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/402810.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Docker系列】Docker 容器时区设置指南

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

尚硅谷MYSQL(5-6章)

排序和分页 排序 如果没有使用排序操作的话 查询出来的数据是按添加的顺序排序的 ORDER BY是来进行排序的 后面可以添加ASC升序 DESC降序 如果后面没有显示指明排序的方式的话 则默认按照升序排序 where中不能使用列的别名 我们在使用sql语句的时候 她的执行顺序不是从第一…

FastCopy文件快速复制v5.7.15

软件介绍 FastCopy文件快速复制工具。Windows平台上最快的文件复制、删除软件&#xff01;功能强劲&#xff0c;性能优越&#xff01;它是源于日本的高效文件复制加速软件&#xff0c;支持拖拽操作&#xff0c;三种不同HDD模式&#xff1b;支持通配符&#xff0c;任务管理/命令…

微信小程序保存图片到相册

申请权限 代码如下 wx.downloadFile({url: image, //仅为示例&#xff0c;并非真实的资源success(res) {// 只要服务器有响应数据&#xff0c;就会把响应内容写入文件并进入 success 回调&#xff0c;业务需要自行判断是否下载到了想要的内容if (res.statusCode 200) {consol…

XSS Game练习

1.Ma Spaghet 直接get传参 ?somebodyaaaa直接使用img标签 ?somebody<img%20src1%20onerror"alert(1337)">官方文档 应使用innertext&#xff0c;安全性更高 2.Jefff 通过代码可以知道是通过eval的代码执行&#xff0c;setTimeout中的内容表示在一秒后执行…

uniapp预览图片uni.previewImage图片放大

<image v-if"file.image!" :src"file.image" click"previewImage(file.image)"></image>file: {image: ,status: 1}, // 预览 图片previewImage() {uni.previewImage({current: 1,urls: [this.img] // 是个 数组 单张的&#xff08…

JAVA打车小程序APP打车顺风车滴滴车跑腿源码微信小程序打车系统源码

&#x1f697;&#x1f4a8;打车、顺风车、滴滴车&跑腿系统&#xff0c;一键解决出行生活难题&#xff01; 一、出行新选择&#xff0c;打车从此不再难 忙碌的生活节奏&#xff0c;让我们常常需要快速、便捷的出行方式。打车、顺风车、滴滴车系统&#xff0c;正是为了满足…

[C#]winform基于opencvsharp结合Diffusion-Low-Light算法实现低光图像增强黑暗图片变亮变清晰

【训练源码】 https://github.com/JianghaiSCU/Diffusion-Low-Light 【参考源码】 https://github.com/hpc203/Diffusion-Low-Light-onnxrun 【论文地址】 https://arxiv.org/pdf/2306.00306.pdf 【算法原理图】 【效果展示】 【测试环境】 vs2019 netframework4.7.2 …

ffmpeg采用gpu加速增加水印

1.环境需要 系统 windows10 ffmpeg&#xff0c;ffprobe 字体文件 python3以上版本 2.环境配置 从官网上下载ffmpeg版本https://github.com/BtbN/FFmpeg-Builds/releases&#xff0c;这里我用的是这个&#xff0c;解压之后里面包含ffmpeg&#xff0c;ffprobe&#xff0c;f…

【uniapp】vue3+vite配置tailwindcss

安装 npm install autoprefixer tailwindcss uni-helper/vite-plugin-uni-tailwind -Dautoprefixer &#xff1a;自动管理浏览器前缀的插件&#xff0c;可以解析css文件并且添加前缀到css内容里。uni-helper/vite-plugin-uni-tailwind: 将 Tailwind CSS 框架集成到使用 Vite 作…

Cesium天空盒子(Skybox)制作(js代码)和显示

介绍 在Cesium中&#xff0c;星空背景是通过天空盒子方式&#xff08;6张图片&#xff09;来显示的&#xff0c;原生的图片分辨率太低&#xff0c;本项目用于生成天空盒子的6张图片。最终生成的6个图片大小约为500kb(每个)&#xff0c;格式为jpg&#xff0c;总共的恒星数目约为…

最新保姆级Anaconda和Pycharm安装激活过程(2024最新版本)

Anaconda和Pycharm安装过程 Anaconda安装过程第一步第二步第三步第四步第五步第六步第七步第八步第九步Pycharm 安装过程&#xff1a;第一步第二步第三步第四步第五步第六步---激活过程第七步第八步第九步第十步第十一步第十二步第十三步第十四步Anaconda和Pycharm软件百度网盘…

Video视频抽帧和WebCodecs API视频抽帧介绍

目录 mp4Box抽帧 ffmpeg抽帧 video元素抽帧 WebCodecs 核心API 视频文件是一个容器&#xff0c;里面有很多不同的轨道信息。如&#xff1a;图像、声音、字幕等。而视频图像信息又是由一系列图片序列帧的集合。如10秒时长的视频&#xff0c;假设每秒30帧。那大概有300条图像…

大公报发表欧科云链署名文章:发行港元稳定币,建Web3.0新生态

欧科云链研究院资深研究员蒋照生近日与香港科技大学副校长兼香港Web3.0协会首席科学顾问汪扬、零壹智库创始人兼CEO柏亮&#xff0c;在大公报发布联合署名文章 ——《Web3.0洞察 / 发行港元稳定币&#xff0c;建Web3.0新生态》&#xff0c;引发市场广泛讨论。 文章就香港稳定币…

2024年【汽车驾驶员(技师)】考试报名及汽车驾驶员(技师)试题及解析

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 汽车驾驶员&#xff08;技师&#xff09;考试报名参考答案及汽车驾驶员&#xff08;技师&#xff09;考试试题解析是安全生产模拟考试一点通题库老师及汽车驾驶员&#xff08;技师&#xff09;操作证已考过的学员汇总…

【二分查找】--- 初阶题目赏析

Welcome to 9ilks Code World (๑•́ ₃ •̀๑) 个人主页: 9ilk (๑•́ ₃ •̀๑) 文章专栏&#xff1a; 算法Joureny 上篇我们讲解了关于二分的朴素模板和边界模板&#xff0c;本篇博客我们试着运用这些模板。 &#x1f3e0; 搜索插入位置 &#x1f4cc; 题目…

【RISC-V设计-12】- RISC-V处理器设计K0A之验证环境

【RISC-V设计-12】- RISC-V处理器设计K0A之验证环境 文章目录 【RISC-V设计-12】- RISC-V处理器设计K0A之验证环境1.简介2.验证顶层3.顶层代码4.模型结构4.1 地址映射4.2 特殊功能寄存器 5.模型代码6.运行脚本7.总结 1.简介 在前几篇文章中&#xff0c;分别介绍了各个模块的设…

VM下kali设置桥接网络

一、查看主机ip 1.winr输入cmd 2.进入终端输入ipconfig 3.查看ip 二、虚拟机网络设置 1.进入vm的虚拟网络编辑器 2.桥接网卡自己选&#xff0c;1是有线网卡2是无线网卡&#xff0c;选择记得点应用 3.虚拟机的网络适配器也要选择桥接模式 三、kali网络配置 1.打开kali终端编辑文…

【经典算法】BFS_最短路问题

1. 最短路问题介绍 最短路径问题是图论中的一类十分重要的问题。本篇文章只介绍边权为1(或边权相同)的最简单的最短路径问题。所谓边权&#xff0c;就是两点之间的距离。 这类问题通俗的说就是告诉你起点和终点&#xff0c;要你找出最短的路径或是最短路径是多少。 解决方法&…