news 2026/7/13 20:50:03

C语言学习笔记20260713-格式化输入输出家族汇总

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C语言学习笔记20260713-格式化输入输出家族汇总

C语言学习笔记20260713-格式化输入输出家族汇总

核心概念:这组函数本质相同,区别仅在于数据源(Source)和目的地(Destination)不同。
头文件<stdio.h>

核心对比总览

函数族函数名数据来源 (Input)数据去向 (Output)典型应用场景
标准 I/Oscanf键盘 (stdin)内存变量用户交互输入
printf内存变量屏幕 (stdout)打印结果、日志
文件 I/Ofscanf文件指针 (FILE*)内存变量读取配置文件、解析文本数据
fprintf内存变量文件指针 (FILE*)写入日志文件、保存数据
字符串 I/Osscanf字符串 (char*)内存变量解析字符串中的特定数据(如提取 IP)
sprintf内存变量字符串 (char*)拼接字符串、数字转字符串

1. 标准输入输出:人机交互

这是最基础的函数,默认绑定到控制台(黑窗口)。

  • scanf:等待用户在键盘敲击并回车,将数据读入变量。
  • printf:将变量的内容显示在屏幕上。

代码示例

#include<stdio.h>intmain(){intage;// printf: 提示用户输入printf("请输入你的年龄: ");// scanf: 从键盘读取整数存入 age// 注意:这里必须加 & 取地址符if(scanf("%d",&age)==1){// printf: 格式化输出结果printf("你今年 %d 岁了。\n",age);}else{printf("输入无效!\n");}return0;}

2. 文件流操作:持久化存储

这两个函数比标准 I/O 多了一个参数FILE *stream,用于指定操作哪个文件。

  • fscanf:从文件中按格式读取数据。
  • fprintf:按格式将数据写入文件。

代码示例

#include<stdio.h>intmain(){FILE*fp=fopen("data.txt","w+");if(!fp)return1;charname[50]="Alice";intscore=98;// fprintf: 将数据格式化写入文件// 类似于 printf,但第一个参数是文件指针fprintf(fp,"Name: %s, Score: %d\n",name,score);// 重置文件指针到开头以便读取rewind(fp);charread_name[50];intread_score;// fscanf: 从文件读取格式化数据// 类似于 scanf,但第一个参数是文件指针if(fscanf(fp,"Name: %s, Score: %d",read_name,&read_score)==2){printf("读取成功 -> 姓名: %s, 分数: %d\n",read_name,read_score);}fclose(fp);return0;}

3. 字符串流操作:内存中的转换

这两个函数不依赖外部设备或文件,直接在内存中的字符数组(字符串)进行操作。

  • sscanf(String Scan):从一个已存在的字符串中提取数据。
  • sprintf(String Print):将各种类型的数据拼接到一个字符串中。

场景 A:使用sscanf解析复杂字符串

假设你有一个字符串"2023-10-05",想把它拆分成年、月、日。

#include<stdio.h>intmain(){constchar*date_str="2023-10-05";intyear,month,day;// sscanf: 从 date_str 中按 "-" 分割提取整数// 返回值是成功匹配并赋值的变量个数intcount=sscanf(date_str,"%d-%d-%d",&year,&month,&day);if(count==3){printf("解析成功: %d 年 %d 月 %d 日\n",year,month,day);}return0;}

场景 B:使用sprintf拼接/转换字符串

假设你想把多个变量拼成一句话,或者把数字变成字符串。

#include<stdio.h>intmain(){charbuffer[100];// 目标缓冲区,必须足够大intid=1001;doubleprice=99.5;// sprintf: 将数据格式化写入 buffer 字符串// 注意:如果数据太长超过 buffer 大小,会发生溢出(危险!)sprintf(buffer,"ID: %d, Price: %.2f USD",id,price);printf("生成的字符串: %s\n",buffer);// 应用:数字转字符串charnum_str[20];sprintf(num_str,"%d",12345);printf("数字转字符串: %s\n",num_str);return0;}

⚠️ 安全提示与最佳实践

  1. sprintf的隐患

    • sprintf不检查目标缓冲区的大小,容易导致缓冲区溢出。
    • 推荐替代方案:使用snprintf(buffer, size, ...),它可以限制写入的最大长度,更加安全。
    // 安全写法:限制最多写入 sizeof(buffer)-1 个字符snprintf(buffer,sizeof(buffer),"ID: %d",id);
  2. scanf的隐患

    • 读取字符串时如果不限制长度(如%s),用户输入过长也会导致溢出。
    • 推荐写法scanf("%19s", str)(假设str大小为 20)。
  3. 返回值检查

    • 所有的scanf系列函数都会返回成功匹配并赋值的项数。务必检查返回值以确保数据解析正确。

总结

C 语言的格式化输入输出家族提供了灵活的数据处理能力:

  • 标准 I/O用于人机交互
  • 文件 I/O用于数据持久化
  • 字符串 I/O用于内存中的数据转换和解析

掌握这些函数的区别和使用场景,能够让你在处理各种数据输入输出任务时更加得心应手。记住安全第一,始终检查返回值并使用安全的替代函数(如snprintf)。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/13 20:47:28

高级技巧:优化mlx-community/Qwen3.5-2B-OptiQ-4bit推理性能的10个方法

高级技巧&#xff1a;优化mlx-community/Qwen3.5-2B-OptiQ-4bit推理性能的10个方法 【免费下载链接】Qwen3.5-2B-OptiQ-4bit 项目地址: https://ai.gitcode.com/hf_mirrors/mlx-community/Qwen3.5-2B-OptiQ-4bit Qwen3.5-2B-OptiQ-4bit是一个基于MLX框架的混合精度量化…

作者头像 李华
网站建设 2026/7/13 20:46:15

如何在5分钟内启动Laguna-M.1-mxfp8模型?MLX框架一键部署教程

如何在5分钟内启动Laguna-M.1-mxfp8模型&#xff1f;MLX框架一键部署教程 【免费下载链接】Laguna-M.1-mxfp8 项目地址: https://ai.gitcode.com/hf_mirrors/mlx-community/Laguna-M.1-mxfp8 想要快速体验强大的Laguna-M.1模型吗&#xff1f;&#x1f914; 这篇终极指南…

作者头像 李华
网站建设 2026/7/13 20:45:18

30分钟快速部署:如何零成本创建你的专属AI数字人克隆

30分钟快速部署&#xff1a;如何零成本创建你的专属AI数字人克隆 【免费下载链接】Duix-Avatar &#x1f680; Truly open-source AI avatar(digital human) toolkit for offline video generation and digital human cloning. 项目地址: https://gitcode.com/GitHub_Trendin…

作者头像 李华
网站建设 2026/7/13 20:45:14

微信模拟生成器:全方位还原聊天、朋友圈与红包功能

# 微信模拟生成器&#xff1a;全方位还原聊天、朋友圈与红包功能在软件测试、产品演示、安全教育或内容创作中&#xff0c;我们常常需要一个“真实”的微信界面——但不是真的去注册账号、发送消息&#xff0c;而是通过模拟来快速生成对话截图。**微信模拟生成器**正是为这类场…

作者头像 李华