当前位置: 首页 > news >正文

C++:输入输出机制与格式化

输入输出机制与格式化全解

无论是算法竞赛还是日常开发,熟练掌握输入输出(I/O)及其格式化控制都是程序员的基本功。本篇博客将带你全面梳理 C 和 C++ 语言中常见 I/O 函数的区别、用法以及踩坑点。

1. 字符级读写:getchar()putchar()

如果你需要极其快速地读取或输出单个字符,这两个函数是首选。它们都包含在 <cstdio> 头文件中。

  • getchar()
    • [cite_start]特点:它不会忽视空格和换行符。读取成功时返回的是字符对应的 ASCII 码(int 类型)。[cite: 2503]
    • [cite_start]失败处理:如果读取失败,会返回常量 EOF(值为 -1)。在 Windows 系统下,可以通过 Ctrl + Z 来模拟读取失败。[cite: 2514, 2515]
  • putchar()
    • [cite_start]特点:接受一个整型参数,并将其对应的 ASCII 字符输出到屏幕上。[cite: 2516]
    • [cite_start]组合使用putchar(getchar()) 是一种非常经典的快捷组合,可以用来回显用户输入的字符。[cite: 2517]

2. 格式化读写:scanf()printf()

这两个老牌的 C 语言函数在 C++ 中依然经常使用,因为它们在格式化控制上极其精确。

printf() 的进阶玩法

除了常规的 %d%f 外,printf 还有许多强大的格式化功能:

  • 占位符内嵌占位符 (*)
    [cite_start]如果你不想把宽度写死,可以使用 * 动态传入宽度和精度参数。[cite: 2552]
    // 8代表总宽度,4代表小数点后精度
    printf("%*.*f", 8, 4, 3.14); // 输出: "  3.1400"
    
  • 前导补零:不足特定位数时,在前面补零,常用于日期或编号输出。
    printf("%05d", 3); // 输出: 00003
    
    [cite_start](注:如果限制最小输出长度,浮点数的小数点 . 也会被算进长度内) [cite: 2543]

scanf() 的精准截取

scanf 可以通过格式字符串强制限制读取的长度,从而精准截取需要的部分:

int n, y;
// 假设输入是 201901
scanf("%4d%2d", &n, &y); 
// 此时 n 为 2019,y 为 01

[cite_start](注:对于字符串输入,scanf("%4s", a) 限制的最大读取长度并不包括系统自动加上的 \0) [cite: 2626]

[cite_start]注意scanf 在读取浮点数时,如果输入了类似 -13.45e12#,它会在读到 # 时停止读取,因为 # 不属于合法的科学计数法字符。[cite: 2597, 2608]

3. C++ 的流式输入输出:cincout

C++ 引入了更安全的流式机制,包含在 <iostream> 中。

cin 的读取机制

  • [cite_start]无论是读取什么类型的数据,cin 都是以字符流的形式提取,并自动转换为相应的类型。[cite: 2638]
  • [cite_start]避坑cin 在默认情况下只能读取可见字符。遇到换行符、制表符、空格时,它会停止读取,不会提取这些空白字符。[cite: 2640]
  • [cite_start]如果需要读取包括空格在内的所有字符,可以使用 cin.get() 函数连续读取单个字符。[cite: 2648]

动态切换输入进制

你可以随时更改 cin 读取整型数据时的默认进制:

int i;
cin >> hex >> i; // 以十六进制读取
cin >> oct >> i; // 以八进制读取
cin >> dec >> i; // 切换回十进制

4. cout 格式化神器:<iomanip>

在 C++ 中,如果我们想实现类似 printf 那样复杂的排版,就需要引入 <iomanip> 头文件。

对齐与填充控制

  • [cite_start]setw(n):设置输出宽度为 n注意:它仅仅对紧紧跟在其后面的第一个输出项有效。[cite: 2658]
  • [cite_start]setfill(char):默认的空白填充是空格,可以使用此函数将其改为其他字符(如 *0)。[cite: 2659]
  • [cite_start]left / right:控制输出是左对齐还是右对齐。[cite: 2741]

浮点数精度控制(重点掌握)

浮点数的输出控制稍微有些繁琐,需要搭配使用几个操作符:

  • [cite_start]fixed:以固定的小数点形式表示浮点数。一旦设置,小数就不会再以科学计数法展示。[cite: 2682]
  • [cite_start]scientific:以科学计数法表示小数。[cite: 2683]
  • setprecision(n)
    • [cite_start]如果单独使用:设置的是数字的总有效位数。[cite: 2681]
    • [cite_start]如果搭配 fixed 使用:则严格控制小数点后的数字位数。[cite: 2684]
    • [cite_start]底层逻辑:无论是 printf 还是 coutsetprecision,在截断小数时,默认使用的都是四舍五入规则。[cite: 2723]

5. 补充:<cmath> 数学库的取整函数

在处理计算题时,我们经常需要对浮点数进行取整,头文件 <cmath> 提供了强大的支持:

  • 向上取整:ceil()
    • ceil(4.3) $\to 5$
    • ceil(-3.1) $\to -3$
  • 向下取整:floor()
    • floor(4.2) $\to 4$
    • floor(-3.1) $\to -4$
      [cite_start](注意:这些函数的返回值依然是 double 类型,如果需要整型结果,必须进行显式的强制类型转换) [cite: 2755, 2759]

终极技巧:“人柱力”四舍五入法
如果你不想调用复杂的系统函数,只需掌握一个底层逻辑:
[cite_start]对于正浮点数,只需对其加上 0.5,然后再强制转换为 int,就能完美实现就近取整的四舍五入效果![cite: 2783, 2784]

double a = 3.49;
int b = (int)(a + 0.5); // 3.99 -> 3double a2 = 3.50;
int b2 = (int)(a2 + 0.5); // 4.00 -> 4

声明:本博客由gemini基于laobie本地obsidian笔记转写,意在将obsidian内置图片转化为了纯文本或表格描述,便于博客上传

http://www.jsqmd.com/news/528151/

相关文章:

  • 2026年北京数据资源登记公司推荐:汉唐信通(北京)咨询股份,数据产权登记/数据质量评估公司精选 - 品牌推荐官
  • mPLUG视觉问答效果展示:高清图片精准识别+细节问答真实案例集
  • 计算机毕业设计:Django框架下的智能图书推荐平台开发实践 Django 协同过滤算法 可视化 数据分析 爬虫 大数据 机器学习(建议收藏)✅
  • 圣女司幼幽-造相Z-Turbo部署避坑指南:新手也能轻松搞定
  • 西恩士 高端制造洁净度检测设备生产厂家 全链技术筑牢品控根基 - 技术权威说
  • Js:ES6~ES11基础语法(一)
  • 抖音视频无水印下载终极指南:多平台完整解决方案
  • Llama-3.2V-11B-cot复杂图表解析效果:从学术论文到商业报告
  • 从零到一:基于STM32F103 HAL库的MPU6050六轴传感器实战指南(附完整工程源码)
  • OFA图像描述模型GitHub开源项目管理:协作开发与CI/CD实践
  • 创达机械是致力于打造全球知名品牌的机械公司吗好用吗 - 工业品网
  • 基于CCSv5.5与SYS/BIOS的C6678多核信号量工程配置与调试实战
  • 华为VRF技术在企业多业务网络隔离中的实战部署
  • 灵毓秀-牧神-造相Z-Turbo打包避坑指南:常见问题与解决方案汇总
  • MultiWire:ATmega328P多地址I²C从机模拟库
  • (完全免费)史上最强的商城。虚拟数据刷屏。宝塔API自助开通虚拟主机+美团代付功能+客服AI聊天机器人+全网采集功能无需正则+免费快捷登录功能+实时快递查询
  • 11. 盛最多水的容器
  • acbDecrypter:游戏音频格式解密与转换工具全攻略
  • 不玩虚的,一周解决大企业病
  • Ollama官方下载慢到哭?手把手教你从GitHub Releases找安装包(Win/Mac/Linux全平台)
  • Orcokinin ;NFDEIDRSGFGFN
  • Flutter 依赖管理实战:从版本控制到冲突解决
  • UPX可执行文件压缩工具:效能倍增的二进制优化方案
  • 网络工程师未来发展方向如何?
  • 2026上海公墓陵园推荐,靠谱品牌解决你选陵园墓地的困扰 - myqiye
  • 从Wind到Stata:手把手教你用reshape和recast处理金融数据(避坑指南)
  • 如何用Zotero插件商店打造高效学术工作流?5个智能功能让文献管理效率提升3倍
  • 2026年江苏能提高生产灵活性的卫生用品机械公司费用多少 - 工业推荐榜
  • UE5中如何用UBlueprintFunctionLibrary优化你的蓝图代码?5个高级用法解析
  • Qwen3-VL-8B实战:利用爬虫技术构建多模态训练数据清洗工具