C语言输入函数对比解析
目录
- C语言输入函数全家福(和它们的秘密)
- fgets
- gets
- scanf
- getchar
- fscanf
- 函数对比表
- 灵魂总结
哈哈,看来你正在和C语言的输入函数们玩“大家来找茬”!放心,我会用最接地气的方式给你讲明白,保证比看《甄嬛传》还精彩。咱们先上结论:fgets
是输入函数界的防弹衣,其他函数可能是皇帝的新装。下面进入正片环节——
C语言输入函数全家福(和它们的秘密)
fgets
fgets
:安全感爆棚的暖男
char *fgets(char *str, int n, FILE *stream);
功能:从文件流(比如键盘stdin
)读取一行,直到换行符或读到n-1
个字符。
优点:
- 自带防溢出护盾:
n
参数强制你声明缓冲区大小,比如char buffer[10]; fgets(buffer, 10, stdin);
最多读9个字符,留1个给\0
。 - 会贴心保留换行符(比如输入"Hello\n",
buffer
里存的是"Hello\n\0"
)。
缺点:
- 像个强迫症患者,如果输入太长,剩下的字符会赖在输入缓冲区里等你下次处理。
- 换行符可能让你想手动
strcspn(buffer, "\n")
把它干掉。
这里插入一个函数介绍
strcspn 函数功能
strcspn
是 C 标准库中的一个字符串处理函数,用于计算字符串中从起始位置开始,直到遇到指定字符集合中的任意一个字符为止的长度。该函数返回的是从字符串开头到第一个匹配字符之间的字符数。
函数原型
size_t strcspn(const char *str, const char *reject);
参数说明
str
:要扫描的字符串。reject
:包含需要匹配的字符集合的字符串。
返回值
返回str
中从开头到第一个出现在reject
中的字符之间的字符数。如果str
中没有任何字符出现在reject
中,则返回str
的长度。
示例代码
#include <stdio.h>
#include <string.h>int main() {const char *str = "Hello, World!";const char *reject = " ,!";size_t len = strcspn(str, reject);printf("Length until first match: %zu\n", len); // 输出: 5return 0;
}
解释
在示例中,strcspn
函数会扫描字符串"Hello, World!"
,直到遇到reject
中的字符,
或!
。由于,
是第一个匹配的字符,函数返回5
,即"Hello"
的长度。
应用场景
strcspn
常用于字符串解析,例如在解析命令行参数或处理用户输入时,可以用来查找特定字符或分隔符的位置。
gets
gets
:已被赐死的危险前任
char *gets(char *str); // C11标准中已移除!
功能:读取一行输入,直到换行符(不保留换行符,换成\0
)。
致命缺点:
- 缓冲区溢出之王:完全不检查输入长度,比如
char buffer[5]; gets(buffer);
,如果你输入"ABCDEFG",直接内存崩溃,黑客最爱。
教训:像过期的泡面——别碰!
scanf
scanf
:傲娇的格式控
int scanf(const char *format, ...);
- 功能:按格式读取输入(比如
%d
,%s
)。 - 坑点集锦:
%s
的暴走模式:scanf("%s", buffer);
遇到空格就罢工,且不检查长度。输入"Hello World"只会读"Hello",剩下的留在缓冲区,还可能溢出。- 输入残留问题:如果
scanf("%d", &num);
之后用fgets
,会吃到之前残留的换行符,导致fgets
秒退。
- 保命技巧:
- 用宽度限制:
scanf("%9s", buffer);
(最多读9字符)。 - 清空缓冲区:
while ((c = getchar()) != '\n' && c != EOF);
(但写起来像跳大神)。
- 用宽度限制:
getchar
getchar
:专注单身的极简主义者
int getchar(void);
- 功能:一次读一个字符。
- 使用场景:
- 手动组装字符串:比如实现低配版
fgets
。 - 清理输入缓冲区的工具人。
- 手动组装字符串:比如实现低配版
- 示例:
int c; while ((c = getchar()) != '\n' && c != EOF) { /* 吞掉所有字符 */ }
fscanf
fscanf
:文件界的scanf
int fscanf(FILE *stream, const char *format, ...);
- 功能:从文件流按格式读取(比如读取文件中的数字)。
- 注意:和
scanf
一样有格式匹配的傲娇属性,但至少不会随便炸内存。
函数对比表
函数 | 安全性 | 换行符处理 | 防溢出 | 适用场景 | 危险指数 |
---|---|---|---|---|---|
fgets | ⭐⭐⭐⭐ | 保留并存储 | ✅ | 读取整行输入 | 安全 |
gets | 💀 | 替换为\0 | ❌ | 已淘汰,禁止使用 | 核弹级 |
scanf | ⭐⭐ | 不处理(残留) | ❌ | 格式化输入(需谨慎) | 地雷 |
getchar | ⭐⭐⭐⭐ | 逐字符处理 | ✅ | 单字符输入或清理缓冲区 | 安全 |
fscanf | ⭐⭐ | 同scanf | ❌ | 从文件读取格式化数据 | 地雷 |
灵魂总结
- 选
fgets
的理由:它像你的老妈,总是担心你吃不饱(缓冲区溢出),所以严格限制你的饭量。 scanf
的悲剧:程序员A:“为什么我的程序崩溃了?” 程序员B:“因为你用了scanf("%s", buffer)
,而用户输入了《战争与和平》全文。”getchar
的哲学:生活就像getchar()
,一次只处理一个字符,急不得。
终极建议:除非你在写一次性脚本,否则对用户输入保持“被害妄想症”,用fgets
+sscanf
组合技(先安全读入整行,再解析),保你平安夜夜好眠!
(程序员深夜画面:盯着屏幕怒吼——“为什么这个fgets
后面有个换行符?!” —— 所以记住,buffer[strcspn(buffer, "\n")] = '\0';
是你的解药)
相关文章:
C语言输入函数对比解析
目录 C语言输入函数全家福(和它们的秘密)fgetsgetsscanfgetcharfscanf函数对比表灵魂总结 哈哈,看来你正在和C语言的输入函数们玩“大家来找茬”!放心,我会用最接地气的方式给你讲明白,保证比看《甄嬛传》还…...
【Java-EE进阶】SpringBoot针对某个IP限流问题
目录 简介 1. 使用Guava的RateLimiter实现限流 添加Guava依赖 实现RateLimiter限流逻辑 限流管理类 控制器中应用限流逻辑 2. 使用计数器实现限流 限流管理类 控制器中应用限流逻辑 简介 针对某个IP进行限流以防止恶意点击是一种常见的反爬虫和防止DoS的措施。限流策…...

一个指令,让任意 AI 快速生成思维导图
大家好,我是安仔,一个每天都在压榨 AI 的躺平打工人。 今天分享一个 AI 办公小技巧,让你用一个指令让 AI 生成思维导图。 DeepSeek、Kimi、豆包都可以哈 ~ KimiXMind 安仔经常用 XMind 来绘制思维导图,但是 AI 是没…...
随言随语(十二):盖章
给自己的机器学习生涯做个总结盖个章,讲述下如何跟机器学习擦肩而过的,鉴于当前深度学习和大模型已经走出来的路及理论知识的入门难度,可能以后跟机器学习前沿科技就再没有交集了; 最近也看了马占凯的《ChatGPT:人类新…...

FPGA图像处理(六)------ 图像腐蚀and图像膨胀
默认迭代次数为1,只进行一次腐蚀、膨胀 一、图像腐蚀 1.相关定义 2.图像腐蚀效果图 3.fpga实现 彩色图像灰度化,灰度图像二值化,图像缓存生成滤波模块(3*3),图像腐蚀算法 timescale 1ns / 1ps // // Des…...
Spring三级缓存的作用与原理详解
在Spring框架中,Bean的创建过程涉及到了三级缓存机制。这个机制主要是为了提高单例模式下bean实例化和依赖注入的效率。本文将深入探讨Spring中的三级缓存,以及其在bean生命周期中的重要作用。 首先,让我们理解什么是三级缓存。Spring中的三…...

LVDS系列12:Xilinx Ultrascale系可编程输入延迟(二)
本节讲解Ultrascale IDELAYE3的参数; IDELAYE3参数: REFCLK_FREQUENCY:如果使用COUNT模式,保持300MHz的默认值即可; 如果使用TIME模式,则该值与IDELAYCTRL参考时钟要匹配; DELAY_SRC&#…...

ARM (Attention Refinement Module)
ARM模块【来源于BiSeNet】:细化特征图的注意力,增强重要特征并抑制不重要的特征。 Attention Refinement Module (ARM) 详解 ARM (Attention Refinement Module) 是 BiSeNet 中用于增强特征表示的关键模块,它通过注意力机制来细化特征图&…...

国产免费工作流引擎star 6.5k,Warm-Flow升级1.7.2(新增案例和修复缺陷)
文章目录 主要更新内容项目介绍功能思维导图设计器流程图演示地址官网Warm-Flow视频 主要更新内容 [feat] 开启流程实例,新增流程定义是否存在校验[feat] 新增合同签订流程案例[feat] 新增企业采购流程案例[update] mybatis-plus逻辑删除,删除值和未删除…...

前端二进制数据指南:从 ArrayBuffer 到高级流处理
前端开发中,二进制数据是处理文件、图像、音视频、网络通信等场景的基础。以下是核心概念和用途的通俗解释: 前端二进制数据介绍 1. 什么是前端二进制数据? 指计算机原始的 0 和 1 格式的数据(比如一张图片的底层代码ÿ…...

如何选择高性价比的 1T 服务器租用服务
选择高性价比的 1T 服务器租用服务,可参考以下内容: 1、根据需求选配置 明确自身业务需求是关键。若为小型网站或轻量级应用,数据存储与处理需求不高,选择基础配置服务器即可。如个人博客网站,普通的 Intel Xeon …...

一个可拖拉实现列表排序的WPF开源控件
从零学习构建一个完整的系统 推荐一个可通过拖拉,来实现列表元素的排序的WPF控件。 项目简介 gong-wpf-dragdrop是一个开源的.NET项目,用于在WPF应用程序中实现拖放功能,可以让开发人员快速、简单的实现拖放的操作功能。 可以在同一控件内…...

AI-02a5a6.神经网络-与学习相关的技巧-批量归一化
批量归一化 Batch Normalization 设置合适的权重初始值,则各层的激活值分布会有适当的广度,从而可以顺利的进行学习。那么,更进一步,强制性的调整激活值的分布,是的各层拥有适当的广度呢?批量归一化&#…...

SVGPlay:一次 CodeBuddy 主动构建的动画工具之旅
我正在参加CodeBuddy「首席试玩官」内容创作大赛,本文所使用的 CodeBuddy 免费下载链接:腾讯云代码助手 CodeBuddy - AI 时代的智能编程伙伴 背景与想法 我一直对 SVG 图标的动画处理有浓厚兴趣,特别是描边、渐变、交互等效果能为图标增添许…...

自己手写tomcat项目
一:Servlet的原理 在Servlet(接口中)有: 1.init():初始化servlet 2.getServletConfig():获取当前servlet的配置信息 3.service():服务器(在HttpServlet中实现,目的是为了更好的匹配http的请求方式) 4.g…...

2025年渗透测试面试题总结-安恒[实习]安全工程师(题目+回答)
网络安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。 目录 安恒[实习]安全工程师 一面 1. 自我介绍 2. 前两段实习做了些什么 3. 中等难度的算法题 4. Java的C…...
生成对抗网络(Generative Adversarial Networks ,GAN)
生成对抗网络是深度学习领域最具革命性的生成模型之一。 一 GAN框架 1.1组成 构造生成器(G)与判别器(D)进行动态对抗,实现数据的无监督生成。 G(造假者):接收噪声 ,…...
六、磁盘划分与磁盘配额
目录 1、磁盘划分1.1、什么是磁盘1.2、机械硬盘的结构与关键概念1.3、思考:为什么新买一个1T硬盘,使用时发现可使用容量低于1T1.4、Linux中inode和block1.5、查看超级快信息1.6、磁盘分区与挂载1.6.1、分区工具fdisk与格式化1.6.2、分区工具gdisk与格式化1.7、查看磁盘使用情…...

在WSL中的Ubuntu发行版上安装Anaconda、CUDA、CUDNN和TensorRT
在Windows 11的WSL(Windows Subsystem for Linux)环境中安装Anaconda、CUDA、CUDNN和TensorRT的详细步骤整理: 本文是用cuda12.4与CuDNN 8.9.7 和 TensorRT 9.1.0 及以上对应 一、前言(准备) 确保电脑上有NVIDIA GPU…...
小刚说C语言刷题—1230蝴蝶结
1.题目描述 请输出 n 行的蝴蝶结的形状,n 一定是一个奇数! 输入 一个整数 n ,代表图形的行数! 输出 n 行的图形。 样例 输入 9 输出 ***** **** *** ** * ** *** **** ***** 2.参考代码(C语言版)…...

代码随想录算法训练营第60期第三十九天打卡
大家好,我们今天继续讲解我们的动态规划章节,昨天我们讲到了动态规划章节的背包问题,昨天讲解的主要是0-1背包问题,那么今天我们可能就会涉及到完全背包问题,昨天的题目有一道叫做分割等和子集,今天应该会有…...

计算机网络体系结构深度解析:从理论到实践的全面梳理
计算机网络体系结构深度解析:从理论到实践的全面梳理 本系列博客源自作者在大二期末复习计算机网络时所记录笔记,看的视频资料是B站湖科大教书匠的计算机网络微课堂,祝愿大家期末都能考一个好成绩! 一、常见计算机网络体系结构 …...
Qwen2.5-VL模型sft微调和使用vllm部署
本文的server.py和req.py代码参见:https://github.com/zysNLP/quickllm 配套课程《AIGC大模型理论与工业落地实战》;Deepseek相关课程更新中 1. 安装相关docker镜像:nvcr.io/nvidia/pytorch:25.02-py3 docker pull nvcr.io/nvidia/pytorch:…...
python打卡DAY22
##注入所需库 import pandas as pd import seaborn as sns import matplotlib.pyplot as plt import random import numpy as np import time import shap # from sklearn.svm import SVC #支持向量机分类器 # # from sklearn.neighbors import KNeighborsClassifier …...

【教程】Docker更换存储位置
转载请注明出处:小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你,欢迎[点赞、收藏、关注]哦~ 目录 背景说明 更换教程 1. 停止 Docker 服务 2. 创建新的存储目录 3. 编辑 Docker 配置文件 4. 迁移已有数据到新位置 5. 启动 Docker 服务 6…...

鸿蒙Next API17学习新特性之组件可见区域变化事件新增支持设置事件的回调参数,限制它的执行间隔
概述 鸿蒙开发文档更新的非常快,对应我们开发者的学习能力也要求非常高,今天这篇文章给大家分享一下鸿蒙API17中更新的新特性学习。 鸿蒙 Next 的组件可见区域变化事件在最新的 API Version 17 中得到了增强,新增了支持设置事件的回调参数的…...
AI大模型从0到1记录学习 mysql day23
第 1 章 MySQL概述 1.1 基本概念 1.1.1 数据库是什么? 数据库(DB:Database):存储数据的地方。 1.1.2 为什么要用数据库? 应用程序产生的数据是在内存中的,如果程序退出或者是断电了,…...
spring -MVC-02
SpringMVC-11 - 响应 在 SpringMVC 中,响应是服务器对客户端请求的反馈,它可以以多种形式呈现,包括视图名称、ModelAndView 对象、JSON 数据以及重定向等。以下是对 SpringMVC 中不同响应类型的详细介绍: 1. 视图名称 通过返回…...

深入解析 React 的 useEffect:从入门到实战
文章目录 前言一、为什么需要 useEffect?核心作用: 二、useEffect 的基础用法1. 基本语法2. 依赖项数组的作用 三、依赖项数组演示1. 空数组 []:2.无依赖项(空)3.有依赖项 四、清理副作用函数实战案例演示1. 清除定时器…...

通过Ollama读取模型
通过Ollama读取模型 前言一、查看本地Ollama上有哪些模型二、调用bge-m3模型1、调用模型2、使用bge-m3进行相似度比较 三、调用大模型 前言 手动下载和加载大模型通常需要复杂的环境配置,而使用Ollama可以避免这一问题。本文将介绍如何调用Ollama上的模型。 一、查…...