[C语言日寄] <stdio.h> 头文件功能介绍
在C语言的世界里,<stdio.h> 是一个极其重要的头文件,它提供了标准输入输出功能,是C语言程序与用户交互的核心工具。今天,我们就来深入探讨 <stdio.h> 的功能、使用注意事项以及它的拓展应用。
功能介绍
<stdio.h> 是C语言标准库中的一个核心头文件,它定义了一系列用于输入输出操作的函数、宏和数据类型。这些功能使得程序能够与外部设备(如键盘、显示器、文件等)进行交互。
标准输入输出函数
<stdio.h> 提供了多种用于标准输入输出的函数,这些函数是C语言程序与用户交互的基础。
1. printf 和 scanf
printf 和 scanf 是最常用的输入输出函数。printf 用于格式化输出,它可以根据指定的格式将数据输出到标准输出设备(通常是屏幕)。scanf 用于格式化输入,它可以从标准输入设备(通常是键盘)读取数据,并将其存储到变量中。
#include <stdio.h>int main() {int num;printf("请输入一个整数:");scanf("%d", &num);printf("你输入的整数是:%d\n", num);return 0;
}
2. puts 和 gets
puts 和 gets 是用于字符串输入输出的函数。puts 用于输出字符串,它会自动在字符串末尾添加换行符。gets 用于从标准输入读取字符串,但它已经被弃用,因为它存在缓冲区溢出的风险。取而代之的是 fgets,它允许指定缓冲区大小,从而避免溢出。
#include <stdio.h>int main() {char str[100];printf("请输入一个字符串:");fgets(str, sizeof(str), stdin); // 安全的字符串输入printf("你输入的字符串是:%s", str);return 0;
}
3. fprintf 和 fscanf
fprintf 和 fscanf 是文件输入输出函数的扩展版本。它们与 printf 和 scanf 类似,但可以指定输出或输入的目标文件。这使得程序能够从文件读取数据或将数据写入文件。
#include <stdio.h>int main() {FILE *file = fopen("example.txt", "w");if (file) {fprintf(file, "Hello, World!\n");fclose(file);}file = fopen("example.txt", "r");if (file) {char buffer[100];fscanf(file, "%s", buffer);printf("文件内容:%s\n", buffer);fclose(file);}return 0;
}
文件操作函数
<stdio.h> 提供了丰富的文件操作功能,这些功能使得程序能够对文件进行读写、打开、关闭等操作。
1. fopen 和 fclose
fopen 用于打开一个文件,它需要指定文件名和打开模式(如读模式 "r"、写模式 "w"、追加模式 "a" 等)。fclose 用于关闭文件,释放与文件相关的资源。
#include <stdio.h>int main() {FILE *file = fopen("example.txt", "w");if (file) {fprintf(file, "Hello, World!\n");fclose(file);}return 0;
}
2. fread 和 fwrite
fread 和 fwrite 用于从文件中读取或向文件中写入数据块。它们允许指定读取或写入的数据大小和数量,适合处理二进制文件。
#include <stdio.h>int main() {FILE *file = fopen("example.bin", "wb");if (file) {int data = 12345;fwrite(&data, sizeof(data), 1, file);fclose(file);}file = fopen("example.bin", "rb");if (file) {int data;fread(&data, sizeof(data), 1, file);printf("文件中的数据:%d\n", data);fclose(file);}return 0;
}
格式化输入输出函数
<stdio.h> 提供了多种格式化输入输出函数,这些函数使得程序能够以灵活的方式处理输入输出。
1. sprintf 和 sscanf
sprintf 和 sscanf 是字符串格式化输入输出函数。sprintf 将格式化的数据写入字符串,而 sscanf 从字符串中读取格式化的数据。
#include <stdio.h>int main() {char buffer[100];int num = 123;sprintf(buffer, "数字:%d", num);printf("格式化后的字符串:%s\n", buffer);sscanf(buffer, "数字:%d", &num);printf("从字符串中读取的数字:%d\n", num);return 0;
}
其他功能
<stdio.h> 还提供了一些其他功能,如清除输入缓冲区、设置文件位置指针等。
1. fflush
fflush 用于清除输出缓冲区,将缓冲区中的数据写入目标设备。它通常用于确保数据被及时写入文件或屏幕。
#include <stdio.h>int main() {printf("Hello, World!");fflush(stdout); // 确保输出被立即写入return 0;
}
2. fseek 和 ftell
fseek 和 ftell 用于设置和获取文件位置指针。fseek 可以将文件位置指针移动到指定位置,而 ftell 返回当前文件位置指针的位置。
#include <stdio.h>int main() {FILE *file = fopen("example.txt", "r");if (file) {fseek(file, 0, SEEK_END); // 移动到文件末尾long fileSize = ftell(file); // 获取文件大小printf("文件大小:%ld 字节\n", fileSize);fclose(file);}return 0;
}
注意事项
虽然 <stdio.h> 提供了强大的输入输出功能,但在使用过程中需要注意一些问题,以避免潜在的错误和安全隐患。
1. 输入缓冲区溢出
gets 函数已经被弃用,因为它存在缓冲区溢出的风险。取而代之的是 fgets,它允许指定缓冲区大小,从而避免溢出。
char buffer[100];
fgets(buffer, sizeof(buffer), stdin); // 安全的字符串输入
2. 文件打开失败的处理
在使用 fopen 打开文件时,需要检查文件是否成功打开。如果文件打开失败,fopen 会返回 NULL,此时需要进行错误处理。
FILE *file = fopen("example.txt", "r");
if (!file) {perror("文件打开失败");return 1;
}
3. 文件关闭的必要性
在完成文件操作后,必须调用 fclose 关闭文件。如果文件没有被正确关闭,可能会导致数据丢失或文件损坏。
fclose(file);
4. 格式化字符串的安全性
在使用 printf 和 scanf 等格式化函数时,需要确保格式化字符串与变量类型匹配。不匹配的格式化字符串可能导致未定义行为。
int num = 123;
printf("数字:%d\n", num); // 正确的格式化字符串
5. 文件位置指针的使用
在使用 fseek 和 ftell 时,需要注意文件位置指针的移动方式。SEEK_SET 表示从文件开头开始计算,SEEK_CUR 表示从当前位置开始计算,SEEK_END 表示从文件末尾开始计算。
fseek(file, 0, SEEK_SET); // 移动到文件开头
拓展应用
<stdio.h> 的功能不仅限于基本的输入输出操作,它还可以用于实现一些高级功能,如日志记录、文件加密、数据序列化等。
日志记录是程序开发中常见的需求,<stdio.h> 提供了实现日志记录的基础功能。通过将日志信息写入文件,可以方便地记录程序的运行状态。
#include <stdio.h>
#include <time.h>void log_message(const char *message) {FILE *logFile = fopen("log.txt", "a");if (logFile) {time_t now =相关文章:
[C语言日寄] <stdio.h> 头文件功能介绍
在C语言的世界里,<stdio.h> 是一个极其重要的头文件,它提供了标准输入输出功能,是C语言程序与用户交互的核心工具。今天,我们就来深入探讨 <stdio.h> 的功能、使用注意事项以及它的拓展应用。 功能介绍 <stdio.h…...
一文读懂 Faiss:开启高维向量高效检索的大门
一、引言 在大数据与人工智能蓬勃发展的当下,高维向量数据如潮水般涌现。无论是图像、音频、文本,还是生物信息领域,都离不开高维向量来精准刻画数据特征。然而,在海量的高维向量数据中进行快速、准确的相似性搜索,却…...
【二叉搜索树】
二叉搜索树 一、认识二叉搜索树二、二叉搜索树实现2.1插入2.2查找2.3删除 总结 一、认识二叉搜索树 二叉搜索树(Binary Search Tree,简称 BST)是一种特殊的二叉树,它具有以下特征: 若它的左子树不为空,则…...
R语言统计分析——ggplot2绘图5——拟合光滑曲线
参考资料:R语言实战【第2版】 ggplot2包可以通过计算统计函数并添加到图形中。例如:分级数据、计算密度、轮廓和分位数等。这里我们重点将添加平滑曲线(线性、非线性和非参数)到散点图中。 我们可以使用geom_smooth()函数来添加一…...
疯狂拆单词01
疯狂拆单词01 有些单词是可以拆的,不,是可以反复拆的,拆着拆着,你的词汇量,就能快速飙升: 【】disappointment disappointment n.失望,沮丧,扫兴 (ment-名缀࿰…...
高效学习方法分享
高效学习方法分享 引言 在信息高速发展的今天,学习已经成为每个人不可或缺的一部分。你是否曾感到学习的疲惫,信息的爆炸让你无从下手?今天,我们将探讨几种高效的学习方法,帮助你从中找到适合自己的学习之道。关于学…...
01.双Android容器解决方案
目录 写在前面 一,容器 1.1 容器的原理 1.1.1 Namespace 1.1.2 Cgroups(Control Groups) 1.1.3 联合文件系统(Union File System) 1.2 容器的应用 1.2.1 微服务架构 1.2.2 持续集成和持续部署(CI/…...
一文大白话讲清楚webpack进阶——9——ModuleFederation实战
文章目录 一文大白话讲清楚webpack进阶——9——ModuleFederation实战1. 啥是ModuleFederation2. 创建容器应用3. 创建远程应用4. 启动远程应用5. 使用远程应用的组件 一文大白话讲清楚webpack进阶——9——ModuleFederation实战 1. 啥是ModuleFederation 先看这篇文章&#…...
Mysql意向锁
这里写目录标题 前置问题概念作用兼容互斥性总结 前置问题 首先我们需要问自己什么是意向锁? 为什么要有意向锁? 意向锁如何使用? 概念 mysql官网上对于意向锁的解释中有这么一句话 The main purpose of IX and IS locks is to show that …...
输入一行字符,分别统计出其中英文字母,空格,数字和其他字符的个数。
input_strinput("请输入一行字符: ") letter0 #表示英文字母的个数 space0 #表示空格的个数 digit0 # 表示数字的个数 others0 #表示其它字符的个数for char in input_str:if char.isalpha(): #判断字符char是否字母letter1elif char.isspace(): # 判断是否空格space…...
AD电路仿真
目录 0 前言 仿真类型 仿真步骤 仿真功能及参数设置 仿真模型 应用优势 1 新建原理图 2 放置元器件及布线 3 放置探头 4 实验结果 Operating Point 分析的作用 DC Sweep 的主要功能 Transient Analysis 的主要功能 AC Analysis 的功能 5 总结 1. 直流工作点分析…...
vim 中粘贴内容时提示: -- (insert) VISUAL --
目录 问题现象:解决方法:问题原因: 问题现象: 使用 vim 打开一个文本文件,切换到编辑模式后,复制内容进行粘贴时有以下提示: 解决方法: 在命令行模式下禁用鼠标支持 :set mouse …...
Redis_Redission的入门案例、多主案例搭建、分布式锁进行加锁、解锁底层源码解析
目录 ①. Redis为什么选择单线程? ②. 既然单线程这么好,为什么逐渐又加入了多线程特性? ③. redis6的多线程和IO多路复用入门篇 ④. Redis6.0默认是否开启了多线程? ⑤. REDIS多线程引入总结 ①. Redis为什么选择单线程? ①…...
ZZNUOJ(C/C++)基础练习1021——1030(详解版)
目录 1021 : 三数求大值 C语言版 C版 代码逻辑解释 1022 : 三整数排序 C语言版 C版 代码逻辑解释 补充 (C语言版,三目运算)C类似 代码逻辑解释 1023 : 大小写转换 C语言版 C版 1024 : 计算字母序号 C语言版 C版 代码逻辑总结…...
力扣116. 填充每个节点的下一个右侧节点指针
Problem: 116. 填充每个节点的下一个右侧节点指针 文章目录 题目描述思路复杂度Code 题目描述 思路 遍历思想(利用二叉树的先序遍历) 本题目的难点在于对于不同父节点的邻接问题因此我们可以抽象将两两节点为一组(不同父节点的两个孩子节点也抽象为一组)…...
寒武纪MLU370部署deepseek r1
文章目录 前言一、平台环境准备二、模型下载三、环境安装四、代码修改五、运行效果 前言 DeepSeek-R1拥有卓越的性能,在数学、代码和推理任务上可与OpenAI o1媲美。其采用的大规模强化学习技术,仅需少量标注数据即可显著提升模型性能,为大模…...
Python NumPy(10):NumPy 统计函数
1 NumPy 统计函数 NumPy 提供了很多统计函数,用于从数组中查找最小元素,最大元素,百分位标准差和方差等。 1.1 numpy.amin() 和 numpy.amax() numpy.amin() 用于计算数组中的元素沿指定轴的最小值。 numpy.amin(a, axisNone, outNone, keep…...
Ubuntu下的Doxygen+VScode实现C/C++接口文档自动生成
Ubuntu下的DoxygenVScode实现C/C接口文档自动生成 Chapter1 Ubuntu下的DoxygenVScode实现C/C接口文档自动生成1、 Doxygen简介1. 安装Doxygen1)方法一:2)方法二:2. doxygen注释自动生成插件3. doxygen注释基本语法4. doxygen的生成…...
【字符串两大注意事项】
表达字符串的方式 1.双引号:"hello world" 2.字符指针:char* ptr "hello world" 3.字符数组:char arr[] "hello world"辨析 项目表示方式代表含义内存分布1“hello world”字符串字面量字符串常量就是数据…...
jmap命令详解
jmap 用于生成 heap dump 文件,如果不使用这个命令,还可以使用-XX:HeapDumpOnOutOfMemoryError参数来让虚拟机出现 OOM 的时候自动生成 dump 文件。 jmap 不仅可以生成 dump 文件,还可以查询finalize执行队列、Java 堆的详细信息,…...
Ubuntu系统下交叉编译openssl
一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机:Ubuntu 20.04.6 LTSHost:ARM32位交叉编译器:arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...
React hook之useRef
React useRef 详解 useRef 是 React 提供的一个 Hook,用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途,下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...
Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例
使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件,常用于在两个集合之间进行数据转移,如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model:绑定右侧列表的值&…...
鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/
使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题:docker pull 失败 网络不同,需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
python执行测试用例,allure报乱码且未成功生成报告
allure执行测试用例时显示乱码:‘allure’ �����ڲ����ⲿ���Ҳ���ǿ�&am…...
代理篇12|深入理解 Vite中的Proxy接口代理配置
在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...
保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek
文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama(有网络的电脑)2.2.3 安装Ollama(无网络的电脑)2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...
视觉slam十四讲实践部分记录——ch2、ch3
ch2 一、使用g++编译.cpp为可执行文件并运行(P30) g++ helloSLAM.cpp ./a.out运行 二、使用cmake编译 mkdir build cd build cmake .. makeCMakeCache.txt 文件仍然指向旧的目录。这表明在源代码目录中可能还存在旧的 CMakeCache.txt 文件,或者在构建过程中仍然引用了旧的路…...
【网络安全】开源系统getshell漏洞挖掘
审计过程: 在入口文件admin/index.php中: 用户可以通过m,c,a等参数控制加载的文件和方法,在app/system/entrance.php中存在重点代码: 当M_TYPE system并且M_MODULE include时,会设置常量PATH_OWN_FILE为PATH_APP.M_T…...
