C语言中scanf和printf、fscanf和fprintf、sscanf和sprintf这三对函数的区别

43 篇文章 343 订阅
订阅专栏

前言

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程序运行起来的时候,会自动打开下面这三个流

符号名称对应操作(显示)位置
stdin标准输入流键盘
stdout标准输出流屏幕
stderr标准错误流屏幕

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

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[] = "2021 dragon";
	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 = 2021;
	char s[] = "dragon";
	sprintf(arr, "%d %s", year, s);
	printf("%s\n", arr);//2021 dragon
	return 0;
}

也就是将从区域三中,以区域二的格式读取的数据,存储到区域一指向的位置。
在这里插入图片描述

总结

函数功能
scanf,printf应用于标准输入流和标准输出流的格式化输入输出语句。
fscanf,fprintf应用于所有输入流和所有输出流的格式化输入输出语句。
sscanf,sprintf应用于字符串和格式化数据之间的相互转换
sscanfsprintf 区别
ZL941208的博客
06-12 319
sscanfsprintf
C语言scanf/fscanf/sscanf printf/fprintf/sprintf 函数对比
mlisda的博客
01-16 1032
scanf/fscanf/sscanf printf/fprintf/sprintf
C语言sprintf与sscanf函数[总结]
weixin_34221036的博客
10-04 371
1、前言     我们经常涉及到数字与字符串之间的转换,例如将32位无符号整数的ip地址转换为点分十进制的ip地址字符串,或者反过来。从给定的字符串提取相关内容,例如给定一个地址:http://www.bokeyuan.cn:2345,我们要从地址提出协议,主机地址和端口号。之前对字符串和数字之间的关系不是很熟悉,工作经常涉及到这个,如是好好总结一下。C语言提供了一些列的格式化输入输出函数...
printf、fprintfsprintf的使用和区别
最新发布
yishuihanq的博客
08-16 174
printf、fprintfsprintf的使用和区别
printf与fprintf函数区别
jfkidear的专栏
03-08 2194
printf与fprintf函数区别? 2007-07-20 22:35 printf是标准输出流的输出函数,用来向屏幕这样的标准输出设备输出,而fprintf则是向文件输出,将输出的内容输出到硬盘上的文件或是相当于文件的设备上 printf是有缓冲的输出,fprintf没有缓冲 fprintf()传送输出到一个流函数 原形:int fprintf(FI
fprintfprintfsprintffscanfscanf、sscanf 格式化输入输出
无界编程
03-20 9677
 格式化输入输出1.         fprintf(格式化输出数据至文件) 相关函数  printffscanf,vfprintf表头文件  #include定义函数  int fprintf(FILE * stream, const char * format,.......);函数说明  fprintf()会根据参数format字符串来转换并格式化数据,然后将结
fprintf()、fscanf()与printf()、scanf()的区别——C语言笔记
qq_52189140的博客
03-06 1180
1.定义 fscanf()是格式化读取文件函数,fprintf()是格式化写入函数,而scanf()和printf()我们都知道,简单来说就是一个程序必不可少输入输出,但其实他们只是是fscanf()和fprintf()的特殊形式。严格来说scanf()不叫输入函数,它其实是读取函数printf()也不叫输出文件函数,它是写入文件函数。 2.什么是格式化? 我们知道printf输出和scanf输入的时候分别有输出控制符和输入控制符,表示将什么格式的数据输出或输入,所以说它们是格式化的。 3...
C语言--三组输入输出函数对比(scanf/fscanf/sscanfprintf/fprintf/sprintf
羟基与苯的博客
04-05 557
文章目录前言1. scanfprintf 函数2. fscanf 和 fprintf 函数2.1 fprintf函数2.2 fscanf函数3. sscanfsprintf 函数总结 前言 在C语言有这么三组输入输出函数,分别是: scanfprintffscanf和fprintf、sscanfsprintf 这三组函数都有着输入输出的功能,但它们的区别在哪里呢? 下面分别来介绍: 1. scanfprintf 函数 函数原型: int scanf( const char *fo
fprintfprintfsprintffscanfscanf、sscanf_格式化输入输出
03-30
fprintfprintfsprintffscanfscanf、sscanf_格式化输入输出
sscanfsprintffscanf,fprintf 系列函数的用法小结 doc
09-26
通过以上对`sscanf`、`sprintf`、`fscanf`、`fprintf`的详细介绍,我们可以看出这些函数在处理格式化字符串方面非常灵活且强大。它们在各种应用场景都非常有用,尤其是在需要处理文本文件或者进行字符串解析时。
C语言笔记:格式化输入输出(fprintffscanf、sscanf...)
Crusies的博客
01-04 586
C语言笔记:格式化输入输出(fprintffscanf、sscanf…) 包含以下函数的基本库:stdlib.h fprintf int fprintf(FILE *stream, const char *format,...) fprintf函数按照format说明的格式对输出进行转换,并写到stream流。返回值是实际写入的字符数。出错则返回一个负值。 fprintf(stdout,…)等价于printf(…); sprintf int sprintf(char *s, const char
c 语言的输出
weixin_33676492的博客
04-01 234
printf是标准输出流的输出函数,用来向屏幕这样的标准输出设备输出,而fprintf则是向文件输出, 将输出的内容输出到硬盘上的文件或是相当于文件的设备上   printf是有缓冲的输出,fprintf没有缓冲   fprintf()传送输出到一个流函数   原形:int fprintf(FILE *stream,const char *format[,argument,...]...
sscanfsprintf(ACM)
09-02 1526
sscanfsprintfscanfprintf家族的一对成员,用于处理和分析字符串非常强大得两个函数头文件 stdio.h原型int sscanf(           const char *buffer,           const char *format,           ...           );int sprintf(                  char
sscanf sprintf
H2SO2的专栏
06-09 1000
sscanfsprintfscanfprintf家族的一对成员,用于处理和分析字符串非常强大得两个函数头文件 stdio.h原型int sscanf(               const char *buffer,               const char *format,               ...               );int sprintf(       
fprintfprintf区别
xiaocaichonga的专栏
05-10 626
fprintf 指定输出文本 printf 输出到窗口显示 printf(***) 相当于 fprintf(stdout,***)           参考文献:http://topic.csdn.net/u/20080428/16/15c89c49-952e-45e2-aa03-3aca63fbd3d5.html
printf和fprintf区别-举例
weixin_30699235的博客
12-17 474
#include <stdio.h>int printf( const char *format, ... );printf()函数根据format(格式)给出的格式打印输出到STDOUT(标准输出)和其它参数. 字符串format(格式)由两类项目组成 - 显示到屏幕上的字符和定义printf()显示的其它参数. 基本上, 你可以指定一个包含文本在内的format(格式)字符串,...
sprintf()函数和sscanf()函数区别
小康的博客
11-16 1626
sprintf()是把格式化数据输出成(存储到)字符串。 sscanf()是从字符串读取格式化的数据。 下面用个例子来说明: 先定义一个结构体 struct S { int age; float f; char arr[10]; }; 运用sprintf()函数 int main() { struct S s = { 10, 5.236f, "abcdefg" }; char buf[100] = { 0 }; //将格式化的数据转换成字符串存储到buf sprintf(b
fprintfprintf区别
xiaocaichonga的专栏
05-10 502
fprintf 输出到指定的文本 printf输出到
sprintf与sscanf区别
王匡胤的专栏
05-12 1187
<br /> <br /> <br /> <br /> <br />他们的区别是:一个是输入一个是输出到字符串<br /> <br /> <br /> <br />sprintf:把变量打印到字符串,从而获得数字的字符形式(可以实现将整形转换成字符型)<br />sscanf: 从一个字符串读进与指定格式相符的数据. 格式可以是整型数据等。<br />sprintf应用举例:<br />#include <stdio.h> int main () { char c[100]; int k=2
写文章

热门文章

  • 贪吃蛇(C语言实现) 290163
  • 俄罗斯方块(C语言实现) 176787
  • 哈夫曼树(C语言实现) 94509
  • 八大排序算法(C语言实现) 85875
  • 网络层协议 ——— IP协议 51273

分类专栏

  • 项目 5篇
  • C语言 43篇
  • Golang 17篇
  • C++ 43篇
  • 网络 13篇
  • MySQL 15篇
  • Rust 4篇
  • Python 14篇
  • 剑指Offer 9篇
  • Linux 22篇
  • leetcode 43篇
  • 人生历程 2篇
  • 算法 15篇
  • Windows 1篇
  • 数据结构 36篇

最新评论

  • 传输层协议 ——— TCP协议

    aaaake: 可以拿Keepalive探测帧举例说明下帧结构

  • 传输层协议 ——— TCP协议

    aaaake: 错别字:LASE_ACK => LAST_ACK

  • 【项目设计】高并发内存池

    蓝色空间号Z: 一般写法

  • 【项目设计】高并发内存池

    蓝色空间号Z: //获取对应哈希桶的下标 static inline size_t Index(size_t bytes) { //每个区间有多少个自由链表 static size_t groupArray[4] = { 16, 56, 56, 56 }; if (bytes <= 128) { return _Index(bytes, 3); } else if (bytes <= 1024) { return _Index(bytes - 128, 4) + groupArray[0]; } else if (bytes <= 8 * 1024) { return _Index(bytes - 1024, 7) + groupArray[0] + groupArray[1]; } else if (bytes <= 64 * 1024) { return _Index(bytes - 8 * 1024, 10) + groupArray[0] + groupArray[1] + groupArray[2]; } else if (bytes <= 256 * 1024) { return _Index(bytes - 64 * 1024, 13) + groupArray[0] + groupArray[1] + groupArray[2] + groupArray[3]; } else { assert(false); return -1; } } 这里的3,4,7,10,13应取8,16,128,1024,8×1024

  • C++知识总结(内附超详细知识框架图)

    mm890890: 表情包我c++还行,但看来本文绝对作者太厉害了表情包

最新文章

  • Go Module详解
  • Golang Context详解
  • Golang TCP网络编程
2024年17篇
2023年18篇
2022年94篇
2021年148篇

目录

目录

评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

2021dragon

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或 充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

玻璃钢生产厂家浙江玻璃钢雕塑浮雕厂广东创意玻璃钢雕塑定做价格玻璃钢卡通动物雕塑哪家有山东多彩玻璃钢雕塑优势济源玻璃钢花盆武汉广场玻璃钢卡通雕塑宁波深圳玻璃钢雕塑江苏主题商场美陈批发价玻璃钢仿真奶茶杯雕塑合肥水果玻璃钢雕塑德庆玻璃钢人物雕塑公司天水抽象人物玻璃钢雕塑制作温州玻璃钢雕塑摆件哪里有广东步行街玻璃钢雕塑上饶玻璃钢雕塑制作玻璃钢微小雕塑价格玻璃钢组合雕塑厂鹤壁景观园林校园玻璃钢雕塑绍兴商场美陈市场报价商场圣诞节美陈方案鞍山玻璃钢雕塑上饶玻璃钢动漫雕塑玻璃钢雕塑加工精准推荐山东玻璃钢小品雕塑厂陕西欧式玻璃钢雕塑生产厂家河南省玻璃钢雕塑雕刻加工保定玻璃钢农耕雕塑乐山玻璃钢卡通雕塑价格湖州玻璃钢抽象雕塑咸阳玻璃钢雕塑香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化