尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

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

C语言学习笔记20260713-格式化输入输出家族汇总
📅 发布时间:2026/7/13 21:04:31

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)。

相关新闻

  • Limonade部署指南:从开发到生产的完整部署流程
  • Qwen2.5_3B_Instruct_rai_1.7.1_npu_4K量化策略详解:AWQ/Group 128/Asymmetric技术深度剖析
  • 萧邦中国官方售后服务中心|服务热线及完整地址权威信息通知(2026年7月最新) - 萧邦中国官方服务中心

最新新闻

  • 2026年07月新疆旅游定制包车游与精品小团市场深度观察:五家实力服务商全景解析 - 甄选服务推荐
  • 喷码字体虚边、毛边,墨滴分裂技术层面的成因?
  • SVG 基础:在 HTML 中使用矢量图形
  • 【计算机大数据毕业设计案例】健身打卡分享与体能测评小程序系统的设计与实现 基于 SpringBoot 的用户健身行为分析管理系统(程序+文档+讲解+定制)
  • 【Embedded Development】【LVGL】基于Windows的LVGL模拟界面开发
  • 戴尔笔记本风扇控制终极指南:DellFanManagement让你的笔记本更安静更凉爽

日新闻

  • AI推荐结果怎么优化:适合深圳少儿素质培训机构的GEO服务商哪家好?全程零代码SAAS操作
  • RAG 实战教学完全指南
  • 企业级API网关架构深度解析:IBM Microgateway的技术实现与选型指南

周新闻

  • IX9104 PCIe5.0 高速交换芯片@ACP#完整规格 + 应用场景总结
  • Unity游戏集成Coze智能体:实现NPC智能对话与知识库联动
  • SAP EPIC 建行回单查询:从标准类CL_EPIC_EXAMPLE_CN_CCB_GHTD到Z类的5处关键修改

月新闻

  • 2026年6月公司网站搭建最新热门渠道测评:四大低成本/零代码平台对比+避坑
  • 【Linux】Linux arm 编译QT程序,出现expected “}“报错
  • 【MATLAB例程】四基站二维AOA定位与距离辅助增强对比仿真。基于角度观测和测距修正的固定目标平面定位精度分析

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号