区分 scanf和printf、fscanf和fprintf、sscanf和sprintf函数

news2025/1/16 1:13:50

文章目录

  • 前言
  • scanf和printf
  • fscanf和fprintf
  • sscanf和sprintf
  • 总结

前言

C语言中,许多函数的函数名过于相似,使用者要是不能很好地区分这些函数,就会造成误用,最终导致代码的结果大相径庭。对于scanf和printf函数、fscanf和fprintf函数、sscanf和sprintf函数这三对函数,它们的函数名都只是各自相差一个字母而已,但其功能及其用法却并不相同,有多少人能够真正分清楚它们各自的功能与使用方法呢?

其中,知道printf和scanf函数的人最多,其次是fprint和fscanf函数,知道sprintf和sscanf函数的人最少。本篇博文,就带大家一同认识认识这三对函数,区分它们各自的功能与使用方法。

scanf和printf

scanf函数和printf函数是应用于标准输入流和标准输出流的格式化输入输出语句。

一、scanf函数
scanf函数的功能是从标准输入流读入格式化的数据。

int scanf ( const char * format, ... );

从标准输入流(stdin)读取数据,并根据参数格式将它们存储到附加参数所指向的位置。附加参数应指向已分配的对象(即附加参数应是一个地址,或者说指针),这些对象的类型由格式字符串中相应的格式说明符指定。

scanf("%d", &input);
//scanf("%d", input);//error

scanf函数以%d(整型)的格式从标准输入流读入的数据存储到&input所指向的内存空间。所以说,我们之后若是打印变量input,就会打印出已读取的这个值。

二、printf函数
printf函数的功能是将格式化的数据打印到标准输出流上去。

int printf ( const char * format, ... );

printf函数将format指向的C字符串写入标准输出流(stdout)。如果format字符串中包含格式说明符(以%开头的子序列),则format后面的附加参数将被格式化并插入结果字符串中,以替换它们各自的说明符。

我们平时已经习惯了这样使用printf函数:

printf("hello world!\n");//第一种写法

其实传入printf函数的参数本质上是一个指向字符串的指针,于是我们这样写也是没问题的:

	char arr[] = "hello world!\n";
	printf(arr);//第二种写法

第一种写法中,直接将一个字符串传入printf函数,实际上也是将该字符串的首地址传入了函数,本质上与第二种写法相同,所以那样写也是没有问题的。

fscanf和fprintf

fscanf函数和fprintf函数是应用于所有输入流和所有输出流的格式化输入输出语句。

fscanf函数和fprintf函数是一对文件操作函数

既然说fscanf函数和fprintf函数是应用于所有的标准输出流和标准输入流的函数,那么这对函数的功能也就包含了printf函数和scanf函数的功能。我们完全可以用fscanf函数和fprintf函数来做scanf函数和printf函数做的事。

一、fscanf函数实现scanf函数的功能

int fscanf( FILE *stream, const char *format [, argument ]... );

因为fscanf函数的功能是,从stream中读取数据,并根据参数格式将其存储到附加参数所指向的位置,所以我们只需将参数stream的位置传入stdin,使其在标准输入流中读取数据即可。

所以,下面两句代码的作用是等效的:

	scanf("%d", &input);
	fscanf(stdin, "%d", &input);

二、fprintf函数实现printf函数的功能

int fprintf( FILE *stream, const char *format [, argument ]...);

因为fprintf函数的功能是,将格式化数据写入stream中,所以我们只需将参数stream的位置传入stdout,使其将数据写入标准输出流即可。

所以,下面两句代码的作用是等效的:

	printf("%d\n", input);
	fprintf(stdout, "%d\n", input);

三、拓展

我们之前在介绍文件操作函数的时候就说过,当你要对某一个流进行输入或是输出操作的时候,首先要打开该流,当输入输出操作结束后要及时关闭该流。

既然printf函数和scanf函数也要对标准输入流和标准输出流进行操作,那么为什么在使用printf函数和scanf函数之前,并没有类似于打开文件流的fopen函数的使用,在使用完printf函数和scanf函数后又没有类似于关闭文件流的fclose函数的使用呢?

其实,当C程序运行起来的时候,会自动打开下面这三个流:

在这里插入图片描述

而当程序运行结束后,这三个流又会自动关闭。所以,当我们需要对标准输入流或是标准输出流进行输入输出操作的时候,并不需要通过某些操作来打开这两个流,也不需要我们来关闭这两个流。

sscanf和sprintf

sscanf函数可以从字符串中读取格式化数据,sprintf函数可以将格式化数据写入字符串。

一、sscanf函数

int sscanf ( const char * s, const char * format, ...);

sscanf函数从s读取数据并根据参数格式将其存储到附加参数给定的位置,就像使用scanf一样,但sscanf函数是从s读取数据而不是标准输入(stdin)。

例如,我们要将字符串arr里面的内容按照不同的格式读取出来。

#include <stdio.h>
int main()
{
	char arr[] = "2000 world";
	int year = 0;
	char s[10] = { 0 };
	sscanf(arr, "%d %s", &year, s);
	printf("%d\n", year);//2021
	printf("%s\n", s);//dragon
	return 0;
}

也就是将从区域一中,以区域二的格式读取的数据,存储到区域三指向的空间。

在这里插入图片描述

二、sprintf函数

int sprintf ( char * str, const char * format, ... );

sprintf函数与printf函数功能相似,区别在于:printf函数是将数据格式化后直接打印在屏幕上,而sprintf函数是将数据格式化后存储在str所指向的字符串中。

例如,将数据按照不同的格式写入字符串arr中。

#include <stdio.h>
int main()
{
	char arr[20] = { 0 };
	int year = 2000;
	char s[] = "world";
	sprintf(arr, "%d %s", year, s);
	printf("%s\n", arr);//2000 world
	return 0;
}

也就是将从区域三中,以区域二的格式读取的数据,存储到区域一指向的位置。

在这里插入图片描述

总结

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/678954.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Xcode 15 beta 2 (15A5161b) 发布下载 - Apple 平台 IDE (visonOS 1 beta 已发布)

Xcode 15 beta 2 (15A5161b) 发布下载 - Apple 平台 IDE (visonOS 1 beta 已发布) IDE for iOS/iPadOS/macOS/watchOS/tvOS/visonOS 此版本已加入 visonOS 支持。 请访问原文链接&#xff1a;https://sysin.org/blog/apple-xcode-15/&#xff0c;查看最新版。原创作品&#…

UWB测距方案|3C门店展示防丢报警方案,优化防盗设计提升购机体验

目前市场上最常见的3C产品&#xff08;如手机&#xff0c;平板电脑&#xff0c;电脑等&#xff09;展示防盗是采用有线防盗技术&#xff0c;即底座&#xff0c;防盗线以及警报触头组成。以线下手机营业厅为例&#xff0c;防盗线的长度直接限制了体验者的活动范围&#xff0c;没…

【VC 7/8】vCenter Server 更新(小版本升级)Ⅲ—— VC更新命令行工具 software-packages 更新命令说明

目录 3. software-packages 更新命令说明&#xff08;1&#xff09;查看 VCSA 中所有已安装的修补程序列表ⅰ 查看 VCSA 中已安装的修补程序和软件包的完整列表ⅱ 要按时间顺序查看已应用到 VCSA的所有修补程序ⅲ 要查看特定修补程序的详细信息 &#xff08;2&#xff09;将修补…

Centos7系统安装Docker

目录 1.Docker安装 1.安装Docker 2.启动Docker 2.Docker相关服务及配置镜像加速器 1.Docker安装 1.安装Docker 输入命令curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun进行安装 安装结束后&#xff0c;输入docker -v查看安装的docker版本 2.启动D…

【文献分享】基于边界点优化和多步路径规划的机器人自主探索

论文题目&#xff1a;Autonomous Robotic Exploration Based on Frontier Point Optimization and Multistep Path Planning 中文题目&#xff1a;基于边界点优化和多步路径规划的机器人自主探索 作者&#xff1a;Baofu Fang &#xff1b;Jianfeng Ding ; Zaijun Wang 作者机…

Elasticsearch:redact processor - 编辑处理器

警告&#xff1a;此功能处于技术预览阶段&#xff0c;可能会在未来版本中更改或删除。 Elastic 将尽最大努力解决任何问题&#xff0c;但技术预览版中的功能不受官方 GA 功能的支持 SLA 的约束。 Redact 处理器使用 Grok 规则引擎来模糊输入文档中与给定 Grok 模式匹配的文本。…

VMware虚拟机在Mac上安装

文章目录 下载链接2 下载CentOS操作系统 下载链接 点击下载官网VMware有30天免费试用&#xff0c;我们点击试用&#xff0c;如果后期需要再购买就可以了 也可以选择player版&#xff0c;免费注册然后下载&#xff0c;不用钱 注册好后会给你生成一个许可证密钥 2 下载CentOS操…

VSCode gdb 调试 qemu u-boot 的方法

前言 最近使用 VS Code GDB 调试 qemu&#xff0c;有了一点收获&#xff0c;u-boot 编译后生成了一个 elf 文件&#xff1a;u-boot&#xff0c;是否也可以调试一下&#xff1f; 为何需要 VS Code GDB 调试&#xff0c;直接 gdb 调试不就可以了吗&#xff1f;答案就是&#xff…

区块链技术的应用与前景展望

第一章&#xff1a;引言 在当今数字化时代&#xff0c;区块链技术作为一项前沿技术正迅速崭露头角&#xff0c;并在各个行业展现出巨大的潜力。区块链技术不仅仅是比特币和其他数字货币的基石&#xff0c;更是一种分布式、去中心化的记账和验证技术。本文将探讨区块链技术的应…

Matlab评价模型-TOPSIS法(优劣解距离法)

评价模型-TOPSIS法(优劣解距离法) 1.1 概念 TOPSIS 法是一种常用的组内综合评价方法&#xff0c;能充分利用原始数据的信息&#xff0c;其结果能精确地反映各评价方案之间的差距。基本过程为基于归一化后的原始数据矩阵&#xff0c;采用余弦法找出有限方案中的最优方案和最劣…

C++14部分新特性

文章目录 1、lambda表达式2、constexpr关键字3、函数返回类型推导4、变量模版5、二进制字面值6、数字分位符7、通过类型寻址多元组8、make_unique 1、lambda表达式 C14提供了在lambda式的形参声明中使用auto的能力 泛型 lambda&#xff1a;C14 中的 lambda 表达式可以使用模板…

可维护的代码,高复用性之路:函数式编程带你飞

文章目录 I. 前言介绍函数式编程引言&#xff1a;为什么需要函数式编程 II. 函数式编程基础声明式编程和命令式编程比较纯函数&#xff1a;概念&#xff0c;优点和局限性不可变数据&#xff1a;概念&#xff0c;优点和局限性 III. 函数式编程优点易于理解和调试代码可以提高代码…

Matlab数学建模-典型相关分析

统计分析-典型相关分析 概念 典型相关分析是研究两个多变量&#xff08;向量&#xff09;之间之间的线性相关关系&#xff0c;能够揭示出两组变量之间的内在联系。 CCA(典型相关分析) 在一元统计分析中&#xff0c;用相关系数来衡量两个随机变量的线性相关关系&#xff0c;…

C++ 第三弹继承和多态-类和对象

目录 1.继承 1.1什么是继承&#xff1f; 1.2语法格式 1.3继承权限 1.4继承概念语法格式 1.5赋值兼容规则 1.6继承体系中的作用域 1.7在继承体系中的构造和析构 1.8静态成员继承 1.9友元的继承 1.10不同继承方式下子类的对象模型 1.11继承和组合 2.多态 2.1什么是…

分销架构总结

概述 对于过往分销系统的经验总结。视角上会不区分实物及虚拟服务的分销。 分销定义&#xff1a;将产品从生产者转移到消费者。 分销职责&#xff1a;获客&#xff0c;服务(售前&#xff0c;售中&#xff0c;售后)。核心是通过不同分销渠道将产品能卖出去。 在整体分销网络…

jjy-share-v1.0 一键分享到微博、QQ空间、QQ好友、微信,一键分享,一键分享代码,一键分享插件,一键分享代码插件

项目地址&#xff1a; jjy-share-v1.0: 一键分享到微博、QQ空间、QQ好友、微信作者&#xff1a; 极纪元-橙作者博客&#xff1a;https://cplvfx.blog.csdn.net/码云Gitee&#xff1a;https://gitee.com/cplvfx/时间&#xff1a;2023年6月21日 介绍 一键分享到微博、QQ空间、…

Qt下使用QPainter实现界面上饼状图、圆环图的绘制

文章目录 前言一、示例讲解二、圆环图绘制步骤三、设置圆环图数据四、示例完整代码五、下载链接总结 前言 前面的文章有讲述使用Qt下的Charts 模块来进行饼图的绘制&#xff1a;QChart实现ui界面上指定位置饼状图、圆环图的绘制&#xff0c;但是使用过程中并不能很好的实现自己…

Embedding 嵌入知识入门

原文首发于博客文章Embedding 嵌入知识入门 文本嵌入是什么 向量是一个有方向和长度的量&#xff0c;可以用数学中的坐标来表示。例如&#xff0c;可以用二维坐标系中的向量表示一个平面上的点&#xff0c;也可以用三维坐标系中的向量表示一个空间中的点。在机器学习中&#x…

强化学习从基础到进阶-案例与实践[4.1]:深度Q网络-DQN项目实战CartPole-v0

【强化学习原理项目专栏】必看系列&#xff1a;单智能体、多智能体算法原理项目实战、相关技巧&#xff08;调参、画图等、趣味项目实现、学术应用项目实现 专栏详细介绍&#xff1a;【强化学习原理项目专栏】必看系列&#xff1a;单智能体、多智能体算法原理项目实战、相关技巧…

Redis 原理

Redis 原理 动态字符串SDS Redis中保存的key时字符串&#xff0c;value往往是字符串或字符串集合&#xff0c;字符串是Redis中常见的数据结构 Redis没有直接使用C语言中的字符串&#xff0c;因为C语言字符串存在很多问题&#xff0c;使用起来不方便 Redis构建了一种新型的字…