C陷阱与缺陷——第5章库函数
1. 返回整数的getchar函数
#include <stdio.h>main()
{char c;while((c = getchar()) != EOF){putchar(c);}
}
上述函数是错误的,原因在于程序中的变量c被声明为char类型,而不是int类型,这意味着c无法容下所有可能的字符,特别地,可能无法容下EOF。最终的结果可能有
- 某些合法的输入在截断后与EOF相同,程序将在文件复制的中途终止;
- 另一种可能是c根本无法取到EOF这个值,程序陷入一个死循环;
- 部分编译器对上述实现并不正确,虽然getchar返回结果赋值给char类型变量时会发生截断,但是while中比较了getchar返回值和EOF
2. 更新顺序文件
为了保持与过去不能同时进行读写操作的程序的向下兼容性,一个输入操作不能随后直接紧跟一个输出操作,反之亦然。如果要同时进行输入和输出操作,必须在其中插入fseek函数的调用。
while(fread(fread((char*)&rec, sizeof(rec), 1, fp)) == 1)
{//对rec执行某些操作if(/*rec必须被重新写入*/){fseek(fp, -(long)sizeof(rec), 1);fwrite((char *)&rec, sizeof(rec), 1, fp);fseek(fp, 0L, 1);//虽然看上去什么也没做,但它改变了文件的状态,使得可以正常读写}
}
3. 缓冲输出与内存分配
当一个程序生成输出时,是否有必要将输出立即展示给用户?
程序输出有两种方式:
- 即时处理方式,往往造成较高的系统负担
- 先暂存起来,然后在大块写入的方式
这种控制能力一般时通过库函数setbuf实现的,当buf时一个大小适当的字符数组,那么修改语句如下:
setbuf(stdout, buf);
语句将通知输入输出库,所有写入到stdout到输出都应该使用buf作为输出缓冲区,直到buf缓冲区被填满或者程序员直接调用fflush。
以下程序是错误的:
include <stdio.h>main()
{int c;char buf[BUFSIZ]setbuf(stdout, buf);while((c = getchar()) != EOF)putchar(c);
}
原因在于buf缓冲区最后一次被清空是在main函数结束之后,作为程序交回控制给操作系统之前C运行时库所必须的清理工作的一部分,但是在此之前buf字符数组已经被释放了。要避免这种类型的错误有两种办法:
- 让缓冲数组称为静态数组,可以直接显式声明buf为静态static char buf[BUFSIZ];,也可以把buf声明完全移到main函数之外
- 第二种办法是动态分配缓冲区,在程序中并主动释放分配的缓冲区,如下
char *malloc();
setbuf(stdout, malloc(BUFSIZ));
此时也不用考虑malloc失败的情况,因为malloc分配失败时返回NULL,此时经过setbuf,即标准输出不需要进行缓冲,程序仍然能够工作,只不过速度比较慢而已。
4. 使用errno检测错误
要进行错误处理,这样的写法是错误的:
/*调用库函数*/
if (errno)/*处理错误*/
出错原因在于并没有强制要求库函数一定要设置errno为0,这样errno的值可能是前一个执行失败的库函数设置的值。
这样写也是错误的:
errno = 0;
/*调用库函数*/
if (errno)/*处理错误*/
原因在于库函数调用成功时,既没有强制要求对errno清零,但同时也没有禁止设置设置errno,比如fopen每次新建一个事先并不存在的文件时,即使没有任何程序错误发生,errno也仍然可能被设置。
因此正确的做法是:应该首先检测作为错误提示的返回值,确定程序执行失败,然后在检查errno
/*调用库函数*/
if (返回的错误值)检查errno
相关文章:
C陷阱与缺陷——第5章库函数
1. 返回整数的getchar函数 #include <stdio.h>main() {char c;while((c getchar()) ! EOF){putchar(c);} } 上述函数是错误的,原因在于程序中的变量c被声明为char类型,而不是int类型,这意味着c无法容下所有可能的字符,特…...
【C++上层应用】6. 信号 / 中断
文章目录 【 1. signal 函数 】【 2. raise函数 】 信号是由操作系统传给进程的 中断,会提早终止一个程序。在 UNIX、LINUX、Mac OS X 或 Windows 系统上,可以通过按 CtrlC 产生中断。有些信号不能被程序捕获,但是下表所列信号可以在程序中捕…...
树与二叉树堆:堆的意义
目录 堆的意义: 第一是堆的排序,第二是堆的top k 排行问题 堆的 top k 排行问题: 面对大量数据的top k 问题: 堆排序的实现:——以升序为例 方法一 交换首尾: 建立大堆: 根结点尾结点的…...
什么时候适合做ui自动化测试?什么时候做接口自动化测试
UI自动化测试和接口自动化测试都是软件测试中非常重要的部分,它们各自有适合的应用场景。 适合做UI自动化测试的场景包括: 用户界面(UI)变化频繁的应用程序。需要测试用户交互和流程的应用程序。需要验证页面布局、样式和交互的…...
[ABC261E] Many Operations(dp,位运算,打表)
[ABC261E] Many Operations - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) Problem Statement We have a variable X and N kinds of operations that change the value of X. Operation i is represented as a pair of integers (Ti,Ai), and is the following operati…...
一、爬虫-爬取豆瓣电影案例
1、环境配置 你需要一个pycharm和requests第三方库,在安装完成之后即可继续浏览。 2、操作流程 (1)打开豆瓣电影网站,点击排行榜,点击喜剧,检查 (2)可以看到鼠标每次下移࿰…...
4G5G防爆执法记录仪、防爆智能安全帽赋能智慧燃气,可视化巡检巡线,安全生产管控
随着燃气使用的普及,燃气安全问题日益突出。传统应急安全问题处理方式暴露出以下问题: 应急预案不完善:目前一些燃气企业的应急预案存在实用性不高、流程不清晰等问题,导致在紧急情况下难以迅速启动和有效执行。 部门协同不流畅…...
武汉数字孪生赋能工业制造,加速推进制造业数字化转型
随着数字孪生技术的不断推进,互联网、物联网、智能传感技术开始应用到数控机床的远程服务,状态监控,故障诊断,维护管理等方面。武汉数字孪生是在虚拟空间中创建物理对象的高保真虚拟模型,以模拟其在现实世界中的行为提…...
安卓密码框、EditText
目录 1. 基础使用 2. 密码的展示与隐藏 (1) 使用setTransformationMethod方法 (2) 使用setInputType方法 3. imeOptions属性 4. 单行设置 在安卓中使用密码框普遍采用EditText设置inputType"textPassword"的方式。 1. 基础使用 <EditTextandroid:id"…...
ROS命令行工具
1、roscore 在使用ROS之前,首先要启动roscore进程。当我们在终端中运行这个命令时,系统就会启动ROS Master、参数服务器和日志节点。在这之后,就可以运行任何其他的ROS程序/节点了。所以可以在一个终端窗口运行roscore指令&#…...
深入浅出 Golang 中的直接依赖和间接依赖管理
目录 引言 直接依赖 间接依赖 为什么需要间接依赖? 如何管理间接依赖? 小结 引言 Golang 中的依赖管理是使用 go mod 进行管理的。go mod 是 Golang 官方推出的依赖管理工具,可以帮助开发者管理项目的依赖关系,确保项目代码…...
深入Python元编程:了解声明与初始化定制元类
更多资料获取 📚 个人网站:ipengtao.com 简介 在Python中,元编程是指在运行时创建或定制类的编程。元类是Python中最强大的元编程工具之一,允许您控制类的创建过程。元类是类的类,它控制类的实例化,允许您…...
[传智杯初赛] 期末考试成绩
传智专修学院的 Java 程序设计课程的评价体系是这样的: 首先,所有学生会有一个卷面得分,这个得分一定是一个 [0,100][0,100] 之间的整数。 如果卷面得分在 9090 分及以上,那么他的 GPA(加权平均成绩) 就是…...
Linux 常用基本命令
文章目录 7.1 帮助命令7.1.1 man 获得帮助信息7.1.2 help 获得shell内置命令的帮助信息7.1.3 常用快捷键 7.2 文件目录类7.2.1 pwd 显示当前工作目录的绝对路径7.2.2 ls 列出目录的内容7.2.3 cd 切换目录7.2.4 mkdir 创建一个新的目录7.2.5 rmdir 删除一个空的目录7.2.6 touch …...
阿里云语雀频繁崩溃,有什么文档管理工具是比较稳定的?
10月23 日14:00左右,蚂蚁集团旗下的在线文档编辑与协同工具语雀发生服务器故障,在线文档和官网都无法打开。直到当天晚上22:24,语雀服务才全部恢复正常。从故障发生到完全恢复正常,语雀整个宕机时间将近 8 小时,如此长…...
二分查找(折半查找)探究学习
1.引入 当我们想要查找在一个数组中某一个特定的数它的下标是什么的时候,我们最先想的方法是遍历数组,如下: #include<stdio.h> #include<string.h> int main() { int arr[10]{1,2,3,4,5,6,7,8,9,10}; int key 8;//要找的数是8…...
Android : 异常记录
查询大数据时 报错 android.database.sqlite.SQLiteBlobTooBigException: Row too big to fit into CursorWindow requiredPos0, totalRows1解决办法:cursor DB.rawQuery("select * from " DBhelpUtil.TABLE_NAME" where id ?",new String[]…...
西南科技大学电路分析基础实验A1(元件伏安特性测试 )
目录 一、实验目的 二、实验设备 三、预习内容(如:基本原理、电路图、计算值等) 1、测定线性电阻的伏安特性 2、二极管伏安特性测试 3、测定实际电压源的伏安特性 四、实验数据及结果分析(预习写必要实验步骤和表格) 1、测定线性电阻的伏安特性 2、二极管伏安特性测…...
【Java】泛型的简单使用
文章目录 一、包装类1.基本数据类型和对应的包装类2.自动装箱和自动拆箱3.手动装箱和手动拆箱 二、什么是泛型三、泛型的使用四、裸类型(Raw Type)五、泛型是如何编译的六、泛型的上界七、泛型方法总结 一、包装类 在了解泛型之前我们先了解什么是包装类…...
注册Zoho Mail邮箱:优势与使用体验
如何注册Zoho Mail邮箱?要注册Zoho Mail邮箱,首先打开浏览器,访问Zoho Mail官网,点击页面右上角的“创建帐户”按钮。接下来,按照提示输入你的姓名、生日和性别,以及一个有效的手机号码或电子邮件地址。然后…...
YOLOE官版镜像效果展示:YOLOE-v8s模型在低光照场景下的鲁棒分割效果
YOLOE官版镜像效果展示:YOLOE-v8s模型在低光照场景下的鲁棒分割效果 想象一下,深夜的街道监控画面,或者光线昏暗的仓库内部,传统的视觉模型往往“看不清”或“认不准”,导致关键目标漏检或误判。这正是许多实际应用场…...
从钓鱼邮件看防御:用DMARC报告分析攻击手法(含真实案例拆解)
从钓鱼邮件看防御:用DMARC报告分析攻击手法(含真实案例拆解) 邮件安全防护体系中,DMARC报告常被视为"事后审计工具",但安全团队往往低估了它在攻击溯源中的战略价值。去年某金融企业遭遇的定向钓鱼攻击中&am…...
Linux网络驱动实验
直接参考【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.81 本文仅作为个人笔记使用,方便进一步记录自己的实践总结。 网络驱动是 linux 里面驱动三巨头之一,linux 下的网络功能非常强大,嵌入式 linux 中也常常用到网络功能。前面我们已经讲过…...
终极指南:MoCo性能基准测试揭秘,ImageNet上67.5%准确率如何实现
终极指南:MoCo性能基准测试揭秘,ImageNet上67.5%准确率如何实现 【免费下载链接】moco PyTorch implementation of MoCo: https://arxiv.org/abs/1911.05722 项目地址: https://gitcode.com/gh_mirrors/mo/moco MoCo(Momentum Contras…...
Less 教程
Less 教程 引言 Less(Leaner Style Sheets)是一种由Sass作者开发的开源CSS预处理器。它增加了变量、混合(Mixins)、函数等特性,使CSS更加强大、灵活和易于维护。本教程将为您详细介绍Less的基本用法,帮助您快速上手。 Less 简介 什么是Less? Less 是一个 CSS 预处理…...
Tickers:嵌入式无阻塞软件定时器库
1. 项目概述Tickers是一个轻量级、无阻塞的定时回调库,专为资源受限的嵌入式系统设计。其核心目标是彻底替代delay()函数,在不牺牲实时性、不引入线程调度开销的前提下,实现高精度、可重入、多实例的周期性函数调用。该库不依赖操作系统内核&…...
突破网盘限速壁垒:八大平台通用直链下载解决方案
突破网盘限速壁垒:八大平台通用直链下载解决方案 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘 / 中国移动云盘 / 天翼云盘 …...
零基础快速入门前端 图片水印生成 蓝桥杯真题速刷(助力保底拿奖不捐款)
完成后的效果如下: for (let i 0; i < count; i) {let spandocument.createElement(span)span.innerHTMLtextspan.style.colorcolorspan.style.transformrotate(${deg}deg)span.style.opacityopacitycontainer.appendChild(span) } 1. appendChild 及其…...
NCMDump:突破网易云音乐格式限制的开源解密工具
NCMDump:突破网易云音乐格式限制的开源解密工具 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 当你下载了喜爱的音乐却发现文件格式被加密,无法在其他设备播放时;当你想备份音乐收藏却受限于专有…...
前端骨架搭建
一、安装UI与功能库在终端运行以下命令npm install arco-design/web-vuenpm install lucide-vue-nextnpm install md-editor-v3npm install pinia axios分别安装预计项目所需的UI库、图标库、编辑器、状态管理功能。检查node版本,发现其为过时的v16版本,…...
