第十四讲:C语言字符函数和字符串函数

目录

1. 字符分类函数

2、字符转换函数

3. strlen的使⽤和模拟实现

4. strcpy 的使⽤和模拟实现

5. strcat 的使⽤和模拟实现

6. strcmp 的使⽤和模拟实现

7. strncpy 函数的使⽤

8. strncat 函数的使⽤

9. strncmp函数的使⽤

10. strstr 的使⽤和模拟实现

11. strtok 函数的使⽤

12. strerror 函数的使⽤

13、atoi函数的使用和模拟


正⽂开始

在编程的过程中,我们经常要处理字符和字符串,为了⽅便操作字符和字符串,C语⾔标准库中提供了 ⼀系列库函数,接下来我们就学习⼀下这些函数。

1. 字符分类函数

C语⾔中有⼀系列的函数是专⻔做字符分类的,也就是⼀个字符是属于什么类型的字符的。 这些函数的使⽤都需要包含⼀个头⽂件是 ctype.h

首先第一个函数原型为:

int iscntrl(int c);

检查所传的字符是否是控制字符。

如果 c 是一个控制字符,则该函数返回非零值,否则返回 0。

例如:可以用以下程序判断是否为控制字符

#include<stdio.h>
#include<ctype.h>
int main()
{
	char c = '\a';
	printf("%d ", iscntrl(c));

	return 0;
}

第二个函数的函数原型为:

int isspace(int c);

 检查所传的字符是否是空白字符。

如果 c 是一个空白字符,则该函数返回非零值(true),否则返回 0(false)。

例如:

#include<stdio.h>
#include<ctype.h>
int main()
{
	char c = ' ';
	printf("%d ", isspace(c));

	return 0;
}

第三个函数原型为:

int isdigit(int c);

检查所传的字符是否是十进制数字字符。

如果 c 是一个数字,则该函数返回非零值,否则返回 0。

例如:

#include<stdio.h>
#include<ctype.h>
int main()
{
	char c = '8';
	printf("%d ", isdigit(c));

	return 0;
}

第四个函数原型为:

int isxdigit(int c);

检查所传的字符是否是十六进制数字,十六进制一般用数字 0 到 9 和字母 A 到 F(或 a~f)表示,其中 A~F 表示 10~15: 0 1 2 3 4 5 6 7 8 9 a b c d e f A B C D E F

如果 c 是一个十六进制数字,则该函数返回非零的整数值,否则返回 0。

例如:

#include<stdio.h>
#include<ctype.h>
int main()
{
	char c = '8';
	printf("%d ", isxdigit(c));

	return 0;
}

第五个函数原型为:

int islower(int c);

检查所传的字符是否是小写字母。

如果 c 是一个小写字母,则该函数返回非零值(true),否则返回 0(false)。

例如:

#include<stdio.h>
#include<ctype.h>
int main()
{
	char c = 'a';
	printf("%d ", islower(c));

	return 0;
}

第六个函数声明为:

int isupper(int c);

检查所传的字符是否是大写字母。

如果 c 是一个大写字母,则该函数返回非零值(true),否则返回 0(false)。

例如:

#include<stdio.h>
#include<ctype.h>
int main()
{
	char c = 'A';
	printf("%d ", isupper(c));

	return 0;
}

 第七个函数原型为:

int isalpha(int c);

 检查所传的字符是否是字母。

如果 c 是一个字母,则该函数返回非零值,否则返回 0。

例如:

#include<stdio.h>
#include<ctype.h>
int main()
{
	char c = 'A';
	printf("%d ", isalpha(c));

	return 0;
}

第八个函数原型为:

int isalnum(int c);

检查所传的字符是否是字母和数字。

如果 c 是一个数字或一个字母,则该函数返回非零值,否则返回 0。

例如:

#include<stdio.h>
#include<ctype.h>
int main()
{
	char c = '5';
	printf("%d ", isalnum(c));

	return 0;
}

第九个函数原型为:

int ispunct(int c);

检查所传的字符是否是标点符号字符。

如果 c 是一个标点符号字符,则该函数返回非零值(true),否则返回 0(false)。

例如:

#include<stdio.h>
#include<ctype.h>
int main()
{
	char c = ',';
	printf("%d ", ispunct(c));

	return 0;
}

第十个函数原型为:

int isgraph(int c);

检查所传的字符是否有图形表示法。带有图形表示法的字符是除了空白字符(比如 ' ')以外的所有可打印的字符。

如果 c 有图形表示法,则该函数返回非零值,否则返回 0。

例如:

#include<stdio.h>
#include<ctype.h>
int main()
{
	char c = 'k';
	printf("%d ", isgraph(c));

	return 0;
}

第十一个函数原型为:

int isprint(int c);

 检查所传的字符是否是可打印的。可打印字符是非控制字符的字符。

如果 c 是一个可打印的字符,则该函数返回非零值(true),否则返回 0(false)。

例如:

#include<stdio.h>
#include<ctype.h>
int main()
{
	char c = 'k';
	printf("%d ", isprint(c));

	return 0;
}

上面的代码都十分简单,下面来一个题目,体会一下字符分类函数:

写⼀个代码,将字符串中的⼩写字⺟转⼤写,其他字符不变。

例如:

#include <stdio.h>
#include <ctype.h>
int main()
{
	int i = 0;
	char str[] = "Test String.\n";
	char c;
	while (str[i])
	{
		c = str[i];
		if (islower(c))
			c -= 32;
		putchar(c);
		i++;
	}
	return 0;
}

运行结果为:

2、字符转换函数

C语⾔提供了2个字符转换函数:

int tolower ( int c ); //将参数传进去的⼤写字⺟转⼩写 
int toupper ( int c ); //将参数传进去的⼩写字⺟转⼤写

上⾯的代码,我们将⼩写转⼤写,是-32完成的效果,有了转换函数,就可以直接使⽤ tolower 函 数。

#include <stdio.h>
#include <ctype.h>
int main()
{
	int i = 0;
	char str[] = "Test String.\n";
	char c;
	while (str[i])
	{
		c = str[i];
		if (islower(c))
			c = toupper(c);
		putchar(c);
		i++;
	}
	return 0;
}

3. strlen的使⽤和模拟实现

函数原型为:

size_t strlen ( const char * str );

• 字符串以 '\0' 作为结束标志,strlen函数返回的是在字符串中 '\0' 前⾯出现的字符个数(不包 含 '\0' )。

• 参数指向的字符串必须要以 '\0' 结束。

• 注意函数的返回值为size_t,是⽆符号的( 易错 )

• strlen的使⽤需要包含头⽂件 string.h

例如我们看一道程序:

#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("srt1>str2\n");
	}
	return 0;
}

运行结果为:

很明显,结果与我们的预期不符,实际上这是由于strlen函数的返回值导致的,size_t的返回值是无符号的整形,两个size_t的数相减仍为一个size_t的数,所以结果会是一个正数,在这一点一定要注意,因为比较容易出错。

strlen的模拟实现:

⽅式1:

/计数器⽅式
int my_strlen(const char* str)
{
	int count = 0;
	assert(str);
	while (*str)
	{
		count++;
		str++;
	}
	return count;
}

⽅式2:

//不能创建临时变量计数器
int my_strlen(const char* str)
{
	assert(str);
	if (*str == '\0')
		return 0;
	else
		return 1 + my_strlen(str + 1);
}

⽅式3:

//指针-指针的⽅式
int my_strlen(char* str)
{
	assert(str);
	char* p = str;
	while (*p !='\0')
		p++;
	return p - str;
}

4. strcpy 的使⽤和模拟实现

函数原型为:

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

• 源字符串必须以 '\0' 结束。

• 会将源字符串中的 '\0' 拷⻉到⽬标空间。

• ⽬标空间必须⾜够⼤,以确保能存放源字符串。

• ⽬标空间必须可修改。

strcpy的模拟实现:

char* my_strcpy(char* dest, const char* src)
{
	char* ret = dest;
	assert(dest != NULL);
	assert(src != NULL);

	while ((*dest++ = *src++))
	{
		;
	}
	return ret;
}

5. strcat 的使⽤和模拟实现

函数原型为:

char *strcat(char *dest, const char *src)

• 源字符串必须以 '\0' 结束。

• ⽬标字符串中也得有 \0 ,否则没办法知道追加从哪⾥开始。

• ⽬标空间必须有⾜够的⼤,能容纳下源字符串的内容。

• ⽬标空间必须可修改。

• 使用strcat函数不要让字符串给自己追加,也就是strcat函数的两个参数不能相同。

模拟实现strcat函数:

char* my_strcat(char* dest, const char* src)
{
	char* ret = dest;
	assert(dest != NULL);
	assert(src != NULL);
	while (*dest)
	{
		dest++;
	}
	while ((*dest++ = *src++))
	{
		;
	}
	return ret;
}

6. strcmp 的使⽤和模拟实现

函数原型为:

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

• 标准规定:

◦ 第⼀个字符串⼤于第⼆个字符串,则返回⼤于0的数字

◦ 第⼀个字符串等于第⼆个字符串,则返回0

◦ 第⼀个字符串⼩于第⼆个字符串,则返回⼩于0的数字

⽐较两个字符串中对应位置上字符ASCII码值的⼤⼩。

strcmp函数的模拟实现:

int my_strcmp(const char* str1, const char* str2)
{
	int ret = 0;
	assert(str1 != NULL);
	assert(str2 != NULL);
	while (*str1 == *str2)
	{
		if (*str1 == '\0')
			return 0;
		str1++;
		str2++;
	}
	return *str1 - *str2;
}

7. strncpy 函数的使⽤

函数原型为:

char * strncpy ( char * destination, const char * source, size_t num );

• 拷⻉num个字符从源字符串到⽬标空间。

• 如果源字符串的⻓度⼩于num,则拷⻉完源字符串之后,在⽬标的后边追加0,直到num个。

模拟实现:

char* my_strncpy(char* dst, const char* src, size_t n)
{
	int i;
	for (i = 0; src[i] && i < n; i++)
	{
		dst[i] = src[i];
	}
	if (i < n)
	{
		dst[i] = 0;
	}
	
	return dst;
}

8. strncat 函数的使⽤

函数原型为:

char *strncat(char *dest, const char *src, size_t n)

将source指向字符串的前num个字符追加到destination指向的字符串末尾,再追加⼀个 \0 字 符。

如果source 指向的字符串的⻓度⼩于num的时候,只会将字符串中到 \0 的内容追加到destination指向的字符串末尾。

模拟实现:

char* my_strcat(char* dst, const char* src, size_t n)
{
	char* tmp = dst;
	while (*dst)
	{
		dst++;
	}
	int i;
	for (i = 0; src[i] && i < n; i++)
	{
		dst[i] = src[i];
	}
	dst[i] = 0;
	return tmp;
}

例如:

#include <stdio.h>
#include <string.h>
int main()
{
	char str1[20];
	char str2[20];
	strcpy(str1, "To be ");
	strcpy(str2, "or not to be");
	strncat(str1, str2, 6);
	printf("%s\n", str1);
	return 0;
}

运行结果为:

9. strncmp函数的使⽤

函数原型为:

int strncmp ( const char * str1, const char * str2, size_t num );

⽐较str1和str2的前num个字符,如果相等就继续往后⽐较,最多⽐较num个字⺟,如果提前发现不⼀ 样,就提前结束,⼤的字符所在的字符串⼤于另外⼀个。如果num个字符都相等,就是相等返回0。

用法与strcmp基本一样,就是要指定比较前多少项。

10. 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;
	pch = strstr(str, "simple");
	strncpy(pch, "sample", 6);
	printf("%s\n", str);
	return 0;
}

运行结果为:

strstr的模拟实现:

char* strstr(const char* str1, const char* str2)
{
	char* cp = (char*)str1;
	char* s1, * s2;
	if (!*str2)
		return((char*)str1);

	while (*cp)
	{
		s1 = cp;
		s2 = (char*)str2;
		while (*s1 && *s2 && !(*s1 - *s2))
			s1++, s2++;
		if (!*s2)
			return(cp);
		cp++;
	}

	return(NULL);
}

11. 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 arr[] = "192.168.6.111";
	char* sep = ".";
	char* str = NULL;
	for (str = strtok(arr, sep); str != NULL; str = strtok(NULL, sep))
	{
		printf("%s\n", str);
	}
	return 0;
}

运行结果为:

例如:

#include<stdio.h>
#include<string.h>
int main()
{
	char arr[] = "wang@year,net";
	char copy[20];
	strcpy(copy, arr);
	char sep[] = "@,";
	char* ret = strtok(copy, sep);
	printf("%s\n", ret);
	ret = strtok(NULL, sep);
	printf("%s\n", ret);
	ret = strtok(NULL, sep);
	printf("%s\n", ret);
	return 0;
}

运行结果为:

12. strerror 函数的使⽤

函数原型为:

char * strerror ( int errnum );

strerror函数可以把参数部分错误码对应的错误信息的字符串地址返回来。

在不同的系统和C语⾔标准库的实现中都规定了⼀些错误码,⼀般是放在 errno.h 这个头⽂件中说明的,C语⾔程序启动的时候就会使⽤⼀个全⾯的变量errno来记录程序的当前错误码,只不过程序启动 的时候errno是0,表⽰没有错误,当我们在使⽤标准库中的函数的时候发⽣了某种错误,就会讲对应 的错误码,存放在errno中,⽽⼀个错误码的数字是整数很难理解是什么意思,所以每⼀个错误码都是有对应的错误信息的。strerror函数就可以将错误对应的错误信息字符串的地址返回。

注:一次只能打印一个错误。但是错误码可能会发生变化,只要是检测出一个与之前不同的错误,错误码就会随之改变。

另外,编译器报出的是语法错误,而这个错误码对应的错误信息是程序运行时的错误。

#include <string.h>
#include <stdio.h>
//我们打印⼀下0到10这些错误码对应的错误信息
int main()
{
	int i = 0;
	for (i = 0; i <= 10; i++) {
		printf("%s\n", strerror(i));
	}
	return 0;
}

运行结果为:

例如:

#include <stdio.h>
#include <string.h>
int main()
{
	FILE* pFile;
	pFile = fopen("unexist.ent", "r");
	if (pFile == NULL)
		printf("Error opening file unexist.ent: %s\n", strerror(errno));
	return 0;
}

运行结果为:

也可以了解⼀下perror函数,perror函数相当于⼀次将上述代码中的第9⾏完成了,直接将错误信息打 印出来。

perror函数打印完参数部分的字符串后,再打印⼀个冒号和⼀个空格,再打印错误信息。这个函数需要头文件stdio.h

例如:

#include <stdio.h>
int main()
{
	FILE* pFile;
	pFile = fopen("unexist.ent", "r");
	if (pFile == NULL)
		perror("Error opening file unexist.ent");
	return 0;
}

运行结果为:

13、atoi函数的使用和模拟

函数原型为:

int atoi(const char *str)

把参数 str 所指向的字符串转换为一个整数(类型为 int 型)。

该函数返回转换后的长整数,如果没有执行有效的转换,则返回零。

模拟实现:

#include<stdio.h>
#include<assert.h>
#include<string.h>
#include<limits.h>
#include<ctype.h>
int my_atoi(const char* str)
{
	assert(str);
	if (*str == '\0')
		return 0;
	while (isspace(*str))
	{
		str++;
	}
	int flag = 1;
	if (*str == '+')
	{
		flag = 1;
		str++;
	}
	else if (*str == '-')
	{
		flag = -1;
		str++;
	}
	long long ret = 0;
	while (*str != '\0')
	{
		if (isdigit(*str))
		{
			ret = ret * 10 + flag * (*str - '0');
			if (ret > INT_MAX || ret < INT_MIN)
			{
				return 0;
			}
		}
		else
		{
			return (int)ret;
		}
		str++;
	}
	return (int)ret;

}

欢迎读者到评论区留言,或者私信。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Qwen-WisdomVast (千问-智瀚)

介绍 Qwen-WisdomVast是以Qwen1.5-7B为底座&#xff0c;使用 DORA LORA 的训练方法&#xff0c;在100w高质量中文多轮SFT数据 20w英文多轮SFT数据 2000单轮自我认知数据训练而来的大模型&#xff0c;数学能力相比Qwen1.5-7B-Chat提升了5.16%&#xff0c;在HumanEval数据集上…

12 nacos 一系列 403 的构造

前言 最近 生产环境环境出现了 一系列的 nacos 403, 然后 这里来大致看一下 各种可能得情况 首先 nacos 服务器需要开启认证配置 这里 nacos 调试版本为 2.0.4 case1 用户无角色关联导致 403 报错的信息如下 2023-06-28 13:05:11.448 ERROR 10279 --- [ mai…

JR-D401 UHD 4K超高清音视频解码器

详细介绍&#xff1a; JR-D401 UHD 4K超高清解码器,AVS2.0/AVS/H.265HEVC/H.264/MPEG2解码&#xff0c;支持RF/ASI/IP输入&#xff0c;支持4K/1080P/1080I/720P/576I/480I多种分辨率&#xff0c;支持DRA/AC3/EAC3/AAC/MPEG等音频,支持4x3G SDI 4K输出。 产品特点 支持多种输入…

图解WebGLThree.js工作原理

一、WebGL背后的工作原理是什么&#xff1f; 以Three.js为例&#xff0c;讲述框架在背后扮演什么样的角色&#xff1f; 二、我们为什么要了解原理&#xff1f; 我们假定你对WebGL已经有一定了解&#xff0c;或者用Three.js做过了一些东西&#xff0c;这个时候&#xff0c;你可…

Conductor 项目的编译启动

本节主要是将Conductor进行启动&#xff0c;观察基本项目的基本能力。 Conductor 后端的编译启动 Conductor是基于17开发的&#xff08;代码中展示11可运行&#xff09;&#xff0c;依赖管理是通过Gradle完成的&#xff0c;要对项目进行编译通过&#xff0c;至少要满足环境如…

Ant Design 组件中文名称大全

整理Ant Design 中主要组件的中英文名称&#xff0c;加深对组件的印象,为后续使用时更容易想起和查找、与团队成员或其他开发者交流时,使用中文名称能够更加清晰地表达自己的意图,有助于沟通交流、可以更好地理解每个组件的功能和适用场景,有助于加深对 Ant Design 组件库的理解…

数据库提权_攻防(1),2024年最新缓存架构技术

第二个组件显示成功&#xff0c;但是没有回显&#xff0c;我们使用dnslog看一下。命令执行成功。 第三个也成功提权&#xff0c;第四个经过测试&#xff0c;提权失败。 三&#xff1a;mysql提权_UDF提权 MOF提权的条件为小于win2008的机型&#xff0c;所以不作研究。 条件&am…

查询category的id存在于项目表中category_id_list的json array字段中

表category 表project 查询category的id存在于项目表中category_id_list的json array字段中。

使用tomcat里的API - Servlet

Servlet 是一组api&#xff0c;操作http协议的&#xff0c;tomcat提供的。 写网站&#xff0c;接收前端传来的http请求&#xff0c;根据请求计算出一个http响应&#xff0c;并把http响应返回到浏览器这边 一、创建一个新的Maven空项目 首次创建maven项目的时候&#xff0c;…

【上海大学计算机组成原理实验报告】三、微指令系统实验

一、实验目的 了解译码器、微指令结构的基本工作原理。学习设计微指令的方法。 二、实验原理 根据实验指导书的相关内容&#xff0c;本实验所用的实验箱的微指令系统控制总线宽度为24位&#xff0c;每个地址单元宽度也为24位&#xff0c;其中微指令存储器由3片8位存储器按照…

PlantUML 实战示例(使用 PlantUML 画用例图、类图、活动图、时序图)

目录 前言 需求场景 用例图 类图 活动图 时序图 前言 在软件开发的生命周期中&#xff0c;需要先进行设计&#xff0c;最后才是进行具体的编码和测试。设计时就需要画各种 UML 图&#xff0c;有专业的 UML 画图软件&#xff0c;也有很多在线的 UML 画图网站可以来画图&a…

k8s部署nacos集群

部署环境&#xff1a; ubuntu20.04docker version 20.10.12k8s version 1.23.1kubeadm 一主两从 本篇主要参考nacos官方k8s配置文档的配置顺序&#xff0c;配置文件。 废话不多说直接开肝。 虚拟机上需要nfs 安装nfs #本篇所有执行的命令都是在root用户下操作 #安装命令&am…

用 ElementPlus 的日历组件 Calendar 自定义渲染

文章目录 需求分析1. 英文改为中文2. 修改样式3. 自定义头部4. 增删改功能接入 需求 使用 ElementPlus中的 Calendar 组件完成自定义渲染 分析 1. 英文改为中文 转为中文的方式&#xff1a;用 ElementPlus的日历组件如何改为中文 2. 修改样式 附源码 <template><…

Flask项目如何在测试环境和生产环境部署上线

前言 最近在使用Flask框架&#xff0c;写一个小项目&#xff0c;在项目部署启动后&#xff0c;出现了以下这段提示&#xff0c;这段提示的意思是&#xff0c;该启动方式适用于开发环境中&#xff0c;生产环境要使用WSGI服务器。 WARNING: This is a development server. Do no…

Redis(Windows版本下载安装和使用)

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

共享IP和独享IP如何选择,两者有何区别?

有跨境用户在选择共享IP和独享IP时会有疑问&#xff0c;不知道该如何进行选择&#xff0c;共享IP和独享IP各有其特点和应用场景&#xff0c;选择哪种方式主要取决于具体需求和预算。以下是对两者的详细比较&#xff1a; 首先两者的主要区别在于使用方式和安全性&#xff1a;共…

AI人工智能讲师简历大模型讲师叶梓大模型技术与应用培训提纲

叶梓&#xff0c;工学博士&#xff0c;高级工程师。现某大型上市企业资深技术专家。 2005年上海交通大学计算机专业博士毕业&#xff0c;在校期间的主研方向为数据挖掘、机器学习、人工智能。毕业后即进入软件行业从事信息化技术相关工作&#xff1b;负责或参与了多项国家级、省…

如何在 JavaScript 中创建自定义事件?

理解 JavaScript 中的事件 在深入研究自定义事件之前&#xff0c;我们首先了解 JavaScript 中事件的概念。事件是浏览器中发生的操作或事件&#xff0c;由用户交互&#xff08;如单击、鼠标移动或键盘输入&#xff09;或浏览器本身&#xff08;如页面加载、调整大小等&#xf…

超详细 - 一文说懂 C++ 继承(上)

目录 0 引言 1. 继承的概念 1.1 继承的本质 1.2 继承的作用 2. 继承的定义 2.1 继承的格式 2.2 继承的权限 2.3 默认继承 2.5 继承权限的使用 3. 继承的作用域 3.1 隐藏 4. 基类与派生类对象的赋值转换 4.1 切片 5. 派生类的默认成员函数 5.1 隐式调用 5.2 …

【软考---系统架构设计师】计算机网络章节

目录 一、TCP/IP协议族 &#xff08;1&#xff09;基本介绍 &#xff08;2&#xff09;TCP和UDP的区别 &#xff08;3&#xff09;DNS协议 &#xff08;4&#xff09;DHCP协议 二、网络规划与设计 &#xff08;1&#xff09;需求分析 &#xff08;2&#xff09;通信规范…