C语言——分支语句
在现实生活中,我们经常会遇到作出选择和判断的时候,在C语言中也同样要面临作出选择和判断的时候,所以今天,就让我们一起来了解一下,C语言是如何作出选择判断的。
目录
1.何为语句?
2.if语句
2.1 if语句的语法结构
2.2 else悬空
2.3 if的书写形式
3.switch语句
3.1 switch的语法结构
3.2 default子句
1.何为语句?
首先,我们要明白什么是语句。在C语言中,语句可以分为以下五类:
表达式语句(比如a = 6;)、函数调用语句(比如printf("%d",a);)、控制语句(分支语句就是其中一种)、复合语句(例如{x = 6;y = 4;z = x + y;printf("%d",z);})、空语句(只有一个分号)。
控制语句即用来实现对程序流程的选择、循环、转向和返回等进行控制(C语言支持顺序结构、选择结构和循环结构三种结构)。C语言共有9种控制语句,可大致分为以下三类:
1.分支语句,也叫条件判断语句:if、switch;
2.循环语句:do while语句、while语句、for语句;
3.转向语句:break语句、goto语句、continue语句、return语句。
今天要讲的就是控制语句中的分支语句,也就是if和switch的语法。
话不多说,我们开始吧!
2.if语句
2.1 if语句的语法结构
首先我们了解一下if语句的使用格式:
if (表达式)语句1;else语句2;//多分支if (表达式1)语句1;else if (表达式2)语句2;else语句3;return 0;
表达式的结果为真,则语句执行,在C语言中,0为假,非0即真。
现在我们来演示一下,实现对年龄的判断,18岁及以上就打印"成年人",18岁以下就打印"未成年",小于0则提示"输入有误"。具体代码如下:
#include<stdio.h>
//代码1
int main()
{//定义一个名为age的整型变量,int age = 0;//输入年龄scanf("%d", &age);//开始判断if (age >= 18)printf("成年人");else if (age < 0)printf("输入有误");//不是>=18也不是<0,那么这里的范围就应该是0到18啦elseprintf("未成年");
}
我们可以发现,每一个if语句后,都跟着一条语句,只要前面条件成立,那么这条语句就会被执行,那如果条件成立,我们要执行多条语句呢?我们又应该怎么写?
我们可以根据上面的代码,再补充一下,具体如下:
#include<stdio.h>
//代码2
int main()
{int age = 0;scanf("%d", &age);if (age >= 18){printf("%d岁", age);printf("是成年人");}else if (age < 0)printf("输入有误");else{printf("%d岁", age);printf("未成年");}return 0;
}
可以看到,不同于代码1,代码2用一对{}将if语句后的多条语句给括起来,这个代码块也就是上面所提到的复合语句,用一对{}括起来的多条语句。所以,当条件成立时需要执行多条语句时,需要把要执行的语句写入{}中,如果没有,那么条件成立时,if语句只会执行在它之后的第一条语句(but我实验了一下,程序直接报错,无法运行。)
事实上只执行一条语句的话,也可以选择使用{},可以让代码看起来更加容易阅读,逻辑更清晰,后面会提到if语句的书写形式,uu们可以比较一下。
2.2 else悬空
uu们可以看一下下面这段代码,大家认为运行结果会是什么呢?
#include<stdio.h>
//代码1
int main()
{int a = 0;int b = 1;if (a == 2)if (b == 1)printf("gg\n");elseprintf("dd\n");return 0;
}
当时在学这个的时候,我就踩坑啦,以为程序会打印出"dd";
事实上,这个程序的运行结果是什么都不打印。
为什么呢?我们来看一下代码2:
#include<stdio.h>
//代码2
int main()
{int a = 0;int b = 1;if (a == 2){if (b == 1){printf("gg\n");}}else{printf("dd\n");}return 0;
}
代码2的运行结果就是"dd"啦,阅读代码2,我们可以清晰地观察到不同if 和else语句之间的从属关系,而在代码1中,else应该是匹配它上面的if(b == 1)的,也就是执行if(b == 1)和else的前提是,if(a == 2)为真。因此当if(a == 2)为假时,下面所有的语句都不会被执行,程序自然就什么都不打印了。
从这两段代码的对比中我们可以学到,else是和离它最近的if相匹配的。
2.3 if的书写形式
#include<stdio.h>
//代码1
int main()
{int a = 0;if (a == 1) {printf("dd");}else {printf("gg");}
}//代码2
int main()
{int a = 0;if (1 == a){printf("dd");}else{printf("gg");}
}
通过上面两段代码的对比,可以看到代码2的逻辑更加清晰,更容易读懂,且不容易出错。
不仅是if语句,在编写程序的时候,我们也要做到严谨、简洁的书写形式,必要时适量加入注释,方便后期重新阅读代码。
3.switch语句
switch语句常常使用于多分支的情况下,当你需要多个条件判断时,用if...else if...else if...else就显得有点冗杂且麻烦了,这时候就需要我们的switch语句发挥作用了。
3.1 switch的语法结构
同样,我们需要先了解一下switch语句的使用格式:
switch (变量表达式){case (常量1):语句1;case (常量2):语句2;......}
不同于if判断真假,switch语句是通过判断变量表达式与其中一个case语句中的常量是否相符,相符时就执行这个case语句后面的语句,并依次执行后面所有case语句中的语句。
以上面代码为例,即当变量表达式的值等于常量1时,就会执行语句1,紧接着执行语句2。
但是如果我们只想执行语句1不想执行语句2呢?
很显然,这个逻辑并不能满足我们实现分支,所以,switch还需要搭配关键字break一起使用;
现在我们来写一个程序,输入1~7,对应输出周一到周日,代码如下:
#include<stdio.h>int main()
{int day = 0;scanf("%d", &day);switch (day){case 1:printf("星期一\n");break;case 2:printf("星期二\n");break;case 3:printf("星期三\n");break;case 4:printf("星期四\n");break;case 5:printf("星期五\n");break;case 6:printf("星期六\n");break;case 7:printf("星期日\n");break;}return 0;
}
假设现在输入3,程序开始运行,此时day = 3,switch找到和day = 3相等的case 3,开始执行case 3 后面的语句,即打印"星期三",紧接着执行break语句,跳出switch语句,程序结束。
运行结果会不会和我们想的一样呢?我们运行一下看看:
运行结果和我们判断的一样,证明我们的思路是没问题的,为了让大家更清晰地感受到break语句在switch语句中的作用,我们现在改变一下需求,输入1~5,打印工作日,输入6或7,打印休息日,代码实现如下:
#include<stdio.h>int main()
{int day = 0;scanf("%d", &day);switch (day){case 1:case 2:case 3:case 4:case 5:printf("工作日\n");break;case 6:case 7:printf("休息日\n");break;}return 0;
}
假设输入1,此时day = 1,程序开始执行case1后的语句,但case1后是没有语句的,所以程序开始执行case2的语句,以此类推,程序会依次执行下去直到case5这里打印"工作日",然后执行break语句跳出switch语句,程序结束。
可以看到,break语句的作用就是将不同case下的语句划分为不同分支。
那么,如果我们输入的不是1~7的数字呢?
这里就引出了和switch语句配套使用的另一个关键字:default。
3.2 default子句
当switch变量表达式和所有case标签的常量都不相符时,switch就会跳过所有的case语句,程序不会报错,也不会终止。
如果我们不想忽略switch变量表达式和所有case标签的常量不匹配的情况,我们就可以在语句列表中增加一条default子句,这个default语句可以出现在语句列表的任意一个位置,当switch变量表达式的值和所有case标签的值不相符时,switch语句就会执行default子句,因此,每个switch语句中只能出现一条default子句。
还是以上面的例子作为示范,我们加入一条default子句,当输入的值不是1~7时,打印"输入有误!",具体代码如下:
#include<stdio.h>int main()
{int day = 0;scanf("%d", &day);switch (day){case 1:case 2:case 3:case 4:
//这里故意将default放到中间,是想告诉大家default子句是可以出现在语句列表任意一个位置的
//但我比较习惯放在结尾default:printf("输入有误!\n");break;case 5:printf("工作日\n");break;case 6:case 7:printf("休息日\n");break;}return 0;
}
我们输入8,看一下运行结果:
在每个switch语句中都放入一条default子句是一个好习惯,也可以在后面加一个break,这样更能体现程序逻辑上的严密性。
以上就是C语言分支语句的所有内容啦,事实上这些语句还能够嵌套调用,这就需要大家勤加练习,多刷题,熟练掌握语句的使用方法啦!
下期内容会给大家介绍一下C语言的循环语句,敬请期待咯^_^
如有错误,还请大佬们及时指出(salute)
如果你觉得这篇文章对你有帮助的话,麻烦动动小手为我点个赞哦OvO
相关文章:
C语言——分支语句
在现实生活中,我们经常会遇到作出选择和判断的时候,在C语言中也同样要面临作出选择和判断的时候,所以今天,就让我们一起来了解一下,C语言是如何作出选择判断的。 目录 1.何为语句? 2.if语句 2.1 if语句的…...
使用Docker安装Jenkins
1、准备 2、安装 详见: https://www.jenkins.io/doc/book/installing/ https://www.jenkins.io/zh/doc/book/installing/ https://www.jenkins-zh.cn/tutorial/get-started/install/ # 方式1: # 详见:https://www.jenkins.io/doc/book/inst…...
东方博宜OJ ——2395 - 部分背包问题
贪心入门 ————2395 - 部分背包问题 2395 - 部分背包问题题目描述输入输出样例问题分析贪心算法思路代码实现总结 2395 - 部分背包问题 题目描述 阿里巴巴走进了装满宝藏的藏宝洞。藏宝洞里面有 N (N < 100)堆金币,第i堆金币的总重量和总价值分别是mi,vi (l …...
【期中准备特辑】计组,电路,信号
计组 以点带面地复习书中内容! 指令体系结构(ISA)是计算机硬件和软件的分界面 世界上第一台电子计算机是 ENIAC(埃尼阿克) 第一代计算机采用电子管作为主要器件;第二代计算机采用晶体管;第三代…...
经典算法 判断一个图是不是树
判断一个图是不是树 问题描述 给一个以0 0结尾的整数对列表,除0 0外的每两个整数表示一条连接了这两个节点的边。假设节点编号不超过100000大于0。你只要判断由这些节点和边构成的图是不是树。是输出YES,不是输出NO。 输入样例1 6 8 5 3 5 2 6 4 5…...
力扣 283 移动零的两种高效解法详解
目录 方法一:两次遍历法 方法二:单次遍历交换法 两种方法对比 在解决数组中的零移动到末尾的问题时,我们需要保持非零元素的顺序,并原地修改数组。以下是两种高效的解法及其详细分析。 方法一:两次遍历法 思路分析…...
代码随想录第18天:二叉树
一、修剪二叉树(Leetcode 669) 递归法 class Solution:def trimBST(self, root: TreeNode, low: int, high: int) -> TreeNode:# 如果当前节点为空,直接返回空节点(递归终止条件)if root is None:return None# 如果…...
KMP算法核心笔记:前后缀本质与nextval实现
KMP算法核心笔记:前后缀本质与nextval实现 核心疑问:为什么用「前后缀」而非「最大子串」? 1. 结构唯一性 前后缀限定在字符串首尾区域,最大子串可位于任意位置只有前后缀能保证滑动后的有效对齐 2. 移动确定性 文本…...
Breeze 40A FOC 电调:Vfast 观测器技术赋能无人机精准动力控制
核心技术特性 1. 全新Vfast 观测器技术 基于先进矢量控制算法(FOC 驱动),实现电机状态实时精准观测,适配性优于传统 FOC 方案,兼容主流无人机动力配置。高效算法设计,输出功率与力效超越多数方波电调&…...
如何处理ONLYOFFICE文档服务器与Java Web应用间的安全认证和授权
如何处理ONLYOFFICE文档服务器与Java Web应用间的安全认证和授权? 处理 ONLYOFFICE 文档服务器与 Java Web 应用之间的安全认证和授权,通常涉及以下几个关键步骤和技术: 1. JWT (JSON Web Token) 认证 启用 JWT: ONLYOFFICE 文档…...
手机上的PDF精简版:随时随地享受阅读
在移动互联网时代,随时随地阅读电子书和文档已经成为许多人的习惯。无论是学习、工作还是娱乐,一款好用的PDF阅读器都是必不可少的工具。今天,我们要介绍的 思读PDF精简版,就是这样一款简洁而强大的PDF阅读工具,能够让…...
XCTF-web(一)
view_source F12ctrluctrlshiftiURL前添加:view-source:curl http://192.168.1.1robots 根据题目提示,查看一下robots.txt /flag_ls_h3re.php backup /index.php.bak ┌──(kali㉿kali)-[~] └─$ cat index.php.bak <html> <…...
字节跳动开源 Godel-Rescheduler:适用于云原生系统的全局最优重调度框架
背景 在云原生调度中,一次调度往往无法解决所有问题,需要配合重调度来优化资源分配和任务摆放。传统的重调度框架主要集中在识别异常节点或任务,并通过迁移或删除来解决。然而,这些框架往往只能解决局部问题,无法提供…...
贪心算法day9(合并区间)
1.合并区间 56. 合并区间 - 力扣(LeetCode) 对于这种区间问题,我们应该先排序根据排序的结果总结一些规律,进而的得出解决该问题的策略。 class Solution {public static int[][] merge(int[][] intervals) {//第一步进行左端点…...
插件化设计,打造个性化音乐体验!
打工人们你们好!这里是摸鱼 特供版~ 今天给大家带来一款超酷的音乐播放器——MusicFree,它不仅功能强大,还支持插件化设计,让你的音乐体验更加个性化! 推荐指数:★★★★★ 1. 插件化设计 功能强大&#…...
深入解析分类模型评估指标:ROC曲线、AUC值、F1分数与分类报告
标题:深入解析分类模型评估指标:ROC曲线、AUC值、F1分数与分类报告 摘要: 在机器学习中,评估分类模型的性能是至关重要的一步。本文详细介绍了四个核心评估指标:ROC曲线、AUC值、F1分数和分类报告。通过对比这些指标…...
2025第16届蓝桥杯省赛之研究生组F题01串求解
2025第16届蓝桥杯省赛之研究生组F题01串求解 一、题目概述二、解题思路2.1题目分析2.2解题思路 三、求解代码3.1求解步骤3.1.1求解x所在的二进制位数区间3.1.2求解总位数为cnt的含1数3.1.3求解cnt1~x之间的含1数 3.2完整代码3.3代码验证 四、小结 一、题目概述 给定一个由0,1,…...
【2-10】E1与T1
前言 之前我们简单介绍了人类从电话线思维到如今的数据报分组交换思维过渡时期的各种技术产物,今天我们重点介绍 E1/T1技术。 文章目录 前言1. 产生背景2. T13. E14. SONET4.1 OC-14.2 OC-3 及其它 5. SDH5.1. STM-1 6. SONET VS SDH后记修改记录 1. 产生背景 E1/…...
2025 年蓝桥杯 Java B 组真题解析分享
今年是我第二次参加蓝桥杯软件类Java B组的比赛,虽然赛前做了不少准备,但真正坐在考场上时,还是有种熟悉又紧张的感觉。蓝桥杯的题目一向以“基础创新”著称,今年也不例外,每道题都考验着我们对算法的理解、代码实现能…...
IMX6ULL2025年最新部署方案2在Ubuntu24.04上编译通过Qt5.12.9且部署到IMX6ULL正点原子开发板上
IMX6ULL2025年最新部署方案2:在Ubuntu24.04上编译通过Qt5.12.9且部署到IMX6ULL正点原子开发板上 前言 本篇方案部署是笔者这几天除了打蓝桥杯以外,笔者在研究的东西,现在写道这里的时候,笔者已经成功的在Ubuntu24.04上,使用默…...
通过微信APPID获取小程序名称
进入微信公众平台,登录自己的小程序后台管理端,在“账号设置”中找到“第三方设置” 在“第三方设置”页面中,将页面拉到最下面,即可通过appid获取到这个小程序的名称信息...
混合开发部署实战:PyInstaller + .NET 8 + Docker全链路配置
文章目录 一、PyInstaller打包Python环境1. 基础打包(Linux环境)2. 高级配置3. 验证打包结果 二、.NET 8与Python的集成模式1. 进程调用(推荐方案)2. REST API通信 三、Docker多阶段构建配置1. 完整Dockerfile示例2. 关键配置解析…...
使用 Sass 打造动态星空背景效果
在前端开发中,视觉效果越来越受到重视。本文将通过一个生动的示例,讲解如何利用 Sass 构建一个具有动态星空滚动效果的背景页面,同时也系统介绍 Sass 的核心功能与实践技巧。 一、Sass 的作用 Sass(Syntactically Awesome Style …...
低空经济有哪些GIS相关岗位?
在低空经济中,GIS(地理信息系统)技术发挥着重要作用。GIS开发工程师负责开发、维护和优化与低空经济相关的GIS系统,如无人机起降场布局、空域管理、气象监测等。一般会参与二、三维GIS项目数据处理与前端开发,以及相关…...
Python 垃圾回收机制全解析:内存释放与优化
在编写高效、稳定的 Python 程序时,内存管理往往是一个被忽视但至关重要的领域。对于 Python 开发者来说,最初的学习曲线通常集中在语法、库使用和应用框架上,而对于内存管理和垃圾回收(GC,Garbage Collection…...
性能优化实践
4.1 大规模量子态处理的性能优化 背景与问题分析 量子计算中的大规模量子态处理(如量子模拟、量子态可视化)需要高效计算和实时渲染能力。传统图形API(如WebGL)在处理高维度量子态时可能面临性能瓶颈,甚至崩溃(如表格中14量子比特时WebGL的崩溃)。而现代API(如WebGPU…...
opentelemetry笔记
span https://github.com/open-telemetry/opentelemetry-cpp/blob/f987c9c094f276336569eeea85f17e361de5e518/sdk/src/trace/span.h 在 OpenTelemetry C 的 sdk/src/trace 目录中,不同的 span 定义和实现是为了支持追踪(Tracing)功能的多样…...
【JavaScript】二十一、日期对象
文章目录 1、实例化日期对象2、相关方法3、时间戳4、案例:毕业🎓倒计时效果 1、实例化日期对象 获得当前时间 const date new Date()获得指定时间 const date new Date(2025-4-14 20:46:00) console.log(date)2、相关方法 方法作用说明getFullYear…...
GIT工具学习【1】:新安装git预操作
目录 1.写在前面2.为常用指令配置别名3.初始化4.解决中文乱码问题 1.写在前面 新安装git命令后,需要一些设置会用的比较的顺畅。 这篇文章只要跟着做即可,至于原理,后面会写清楚的。 2.为常用指令配置别名 #新建一个.bashrc touch ~/.bash…...
docker安装ES
ES安装步骤 1. 创建docker网络,使其docker内部通信 2. 下载 | 导入镜像文件(ES Kibana) 3. 创建容器,并访问 4. 安装Ik分词器(es对中文并不友好,所以需要安装IK分词使其适配中文) 1. 创建docke…...
【控制学】控制学分类
【控制学】控制学分类 文章目录 [TOC](文章目录) 前言一、工程控制论1. 经典控制理论2. 现代控制理论 二、生物控制论三、经济控制论总结 前言 控制学是物理、数学与工程的桥梁 提示:以下是本篇文章正文内容,下面案例可供参考 一、工程控制论 1. 经典…...
人工智能应用开发中常见的 工具、框架、平台 的分类、详细介绍及对比
以下是人工智能应用开发中常见的 工具、框架、平台 的分类、详细介绍及对比: 一、工具(Tools) 定义:用于完成特定任务的软件或库,通常专注于开发流程中的某个环节(如数据处理、模型调试、部署等ÿ…...
Linux磁盘格式化(mkfs、mkfs.xfs、mkfs.ext4)、Linux文件系统的校验(xfs_repair、fsck_ext4)
在Linux系统中,磁盘格式化和文件系统校验是系统管理的重要任务。以下是关键步骤和命令的总结: 磁盘格式化 1. 选择文件系统类型 XFS:适用于大文件和高并发场景,支持高性能和扩展性。ext4:成熟稳定的通用文件系统,适合大多数场景。2. 格式化命令 通用格式: sudo mkfs -…...
Android学习总结之git篇
Git 的原理时,你可以从数据结构、对象存储、引用管理、分支与合并等方面结合源码进行分析。以下是详细介绍: 1. 基本数据结构和对象存储 Git 底层主要基于四种对象来存储数据:blob(数据块)、tree(树&…...
Python基础语法——类型
目录 类型的意义动态类型静态类型 类型的意义 不同的类型,占用的内存空间是不同的. 占几个字节 int 默认是 4 个字节.动态扩容 float 固定 8 个字节 bool 一个字节就足够了 str 变长的 不同的类型,对应能够进行的操作也是不同的 int/float, “” “-” “ * ” “/”——不能使…...
vue2中基于el-select封装一个懒加载下拉框
需求 当下拉选项的数据量过大时,后端接口是分页格式返回数据。 解决方案 自定义封装一个懒加载下拉组件,每次滚动到底部时自动获取下一页数据,这样可有效防止数据量过大时造成组件卡顿。 具体实现步骤 1、创建懒加载下拉选择组件 <t…...
uniapp的h5,打开的时候,标题会一闪而过应用名称,再显示当前页面的标题
问题: 微信小程序,通过webview打开了uniapp创建的h5,但是打开h5时,会先显示h5的应用名称,然后才切换为该页面的标题。 过程: 查过很多资料,有说修改应用名称,有说设置navigationS…...
HarmonyOS 5 开发环境全解析:从搭建到实战
鸿蒙来了,从 1.0 到 5.0,它不再只是“华为的操作系统”,而是万物互联生态的核心驱动。作为开发者,你准备好拥抱这个全新时代了吗? 你是否还在犹豫:HarmonyOS 5 开发门槛高不高?该用 DevEco Stu…...
2.2 函数返回值
1.回顾def def sum(x,y): return xy res sum(10,20) #调用函数 print(res) 2.函数的三个重要属性 -函数的类型:function -函数的ID:16进制的整数数值 -函数的值:封装在函数中的数据和代码 # - 函数是一块内存空间,通过…...
OpenAI发布GPT-4.1:开发者专属模型的深度解析 [特殊字符]
最近OpenAI发布了GPT-4.1模型,却让不少人感到困惑。今天我们就来深入剖析这个新模型的关键信息! 重要前提:API专属模型 💻 首先需要明确的是,GPT-4.1仅通过API提供,不会出现在聊天界面中。这是因为该模型主…...
Cython中操作C++字符串
使用Cython开发Python扩展模块-CSDN博客中文末对python代码做了部分C优化,并提及未对字符串类型做优化,并且提到如果不是真正搞懂了C字符串的操作和Python的C API中与字符串相关的知识,最好不要动Python中的字符串类型。为了搞明白在Cython中…...
Dify插件内网安装,解决Dify1.x插件安装总失败问题,手把手教你暴力破解:从镜像源到二进制打包全攻略
背景 自从dify升级到1.0以后,所有的工具和模型都改成了插件化,需要进行插件的安装。在手撕Dify1.x插件报错!从配置到网络到Pip镜像,一条龙排雷实录 已经指出了dify在线安装插件的各种问题。 首发地址 在前面的几个版本中&…...
二极管详解:特性参数、选型要点与分类
一、二极管的基本定义 二极管(Diode) 是由半导体材料(如硅、锗)构成的双端器件,核心特性是单向导电性。其结构基于PN结,正向偏置导通,反向偏置截止。 核心功能: 整流(交…...
BufferedOutputStream 终极解析与记忆指南
BufferedOutputStream 终极解析与记忆指南 一、核心本质 BufferedOutputStream 是 Java 提供的缓冲字节输出流,继承自 FilterOutputStream,通过内存缓冲区显著提升 I/O 性能。 核心特性速查表 特性说明继承链OutputStream → FilterOutputStream → …...
Google政策大更新:影响金融,新闻,社交等所有类别App
Google Play 4月10日 迎来了2025年第一次大版本更新,新政主要涉及金融(个人贷款),新闻两个行业。但澄清内容部分却使得所有行业都需进行一定的更新。下面,我们依次从金融(个人贷款),…...
【Linux网络与网络编程】10.网络层协议IP
前言 我们之前谈的主机B把数据传递给主机C过程都是黑盒式的,即并没有考虑它的中间过程。本篇博客和下一篇博客将要考虑的问题是:主机B和主机C并不是直接连接的,主机B想要把数据传输给主机C需要经过若干路由器的。我们就引出了两个问题&#x…...
Docker 搭建 RabbitMQ
Docker 搭建 RabbitMQ 前言一、准备工作二、设置目录结构三、编写启动脚本四、Host 网络模式 vs Port 映射模式1. Host 网络模式2. Port 映射模式 五、端口配置对比六、配置示例七、查看与管理八、扩展与高可用九、常用命令 前言 在现代微服务与分布式架构中,Rabbi…...
浏览器自动化检测对抗:修改navigator.webdriver属性的底层实现
一、背景介绍:你被自动化检测拒之门外了吗? 在使用 Selenium 或 Playwright 等浏览器自动化工具爬取数据时,经常会遇到「被检测」问题,尤其像 Amazon 这样反爬策略严密的网站。常见的检测机制之一就是检查 JavaScript 中的 navig…...
聊聊Spring AI Alibaba的DocumentParser
序 本文主要研究一下Spring AI Alibaba的DocumentParser DocumentParser spring-ai-alibaba-core/src/main/java/com/alibaba/cloud/ai/document/DocumentParser.java public interface DocumentParser {/*** Parses a given {link InputStream} into a {link Document}. T…...
用css给div列表加个序号
用 CSS 的 counter 相关属性来为列表添加序号。以下是具体的代码,我将以 HTML 文件的形式提供,并且会运行展示效果: .as-div {// counter-reset: my-counter; /* 计数器名称是my-counter */// counter-reset: small-apple; /* 计数器名称是s…...