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

35 篇文章 6 订阅
订阅专栏
本文介绍了C语言中容易混淆的三对函数:scanf与printf用于标准输入输出,fscanf与fprintf适用于文件输入输出,而sscanf与sprintf则涉及字符串的格式化处理。文章详细解析了每对函数的功能、用法及它们之间的关系,帮助读者理解如何在不同场景下正确使用这些函数。
摘要由CSDN通过智能技术生成

前言

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;
}

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

在这里插入图片描述

总结

在这里插入图片描述

字符串输入函数scanf( )与sscanf( )的区别
qq_64797754的博客
08-09 982
sscanfscanf区别scanf是以键盘作为输入源,sscanf是以字符串作为输入源。 注意:如果第一个字符匹配失败就会结束匹配,所以需要适当过滤操作 ; 如果开头是空格或\n等字符,会直接跳过这些空白字符;...
C语言scanf/fscanf/sscanf printf/fprintf/sprintf 函数对比
mlisda的博客
01-16 1032
scanf/fscanf/sscanf printf/fprintf/sprintf
C语言scanffscanf和sscanf区别
恒等于C的博客欢迎您
10-11 6181
在使用c语言的过程中,我们经常会用到scanfprintf,那么对于对于下面几个类似的函数,有什么区别呢? 对比一组函数区别:一.scanffscanf和sscanf1.scanf2.fscanf3.sscanf二.printf,fprintfsprintf1.printf2.fprintf3.sprintf 一.scanffscanf和sscanf 1.scanf 首先scanf我们的很熟悉,他就是从键盘上输入数据,准确的来说就是: 从标准输入(键盘)读取格式化的数据。 int main.
C语言printf(),sprintf(),scanf(),sscanf()的用法和区别
~探路者~的博客
07-27 727
printf语法:#include <stdio.h> int printf( const char *format, ... );printf()函数根据format(格式)给出的格式打印输出到STDOUT(标准输出)和其它参数中。返回值是输出的字符数量。sprintf语法: #include <stdio.h> int sprintf( char *buffer, const char *f
scanf[^\n]/fscanf 的%[]和%n使用方法
aaaa255116的博客
10-22 2327
标准输入输出函数%[]和%n说明符的使用方法    scanf fscanf,均从第一个非空格的可显示字符开始读起!         标准输入输出函数scanf具有相对较多的转换说明符,它常常作为入门级函数出现在各种教材中。但奇怪的是,[]和n这两种都为c89/c99所规定的标准说明符却鲜少在大多数教材中出现。虽然[]和n说明符的使用频率不及其它说明符,但两者在程序设计中的作用仍然不可小视,尤
sscanfscanf区别
最新发布
海涛高软
04-24 221
在使用sscanf函数时,要确保格式字符串与要解析的数据格式匹配,否则可能会导致解析错误或未定义的行为。sscandf 从字符串中提取数据。scanf 标准输入流读取数据。
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
### sscanfsprintffscanf,fprintf 系列函数的用法小结 #### 1. sscanf函数 **函数原型:** ```c int sscanf(const char *str, const char *format, ...); ``` **功能说明:** `sscanf`函数类似于`scanf`,...
理解【 fscanf 】 【 fprintf 】和【 sscanf 】 【 sprintf
qq_41420688的博客
08-05 462
功能 函数名 适用于 格式化输入函数 scanf 标准输入流 格式化输出函数 printf 标准输出流 格式化输入函数 fscanf 所有输入流 格式化输出函数 fprintf 所有输出流 函数名 功能 sscanf 把一个字符串的信息转换成格式化的数据 sprintf ...
浅析C语言printf(),sprintf(),scanf(),sscanf()的用法和区别
09-05
以下是对C语言printf(),sprintf(),scanf(),sscanf()的用法以及区别进行了详细的分析介绍,需要的朋友可以参考下
C语言sscanffscanfscanfsprintf、fprintfprintf函数区别与相似分析
2301_80038635的博客
01-25 1523
实际上fscanf就多了一个FILE * 的参数,也就是打开的文件的地址参数,所有当我们进行使用的时候,我们可以先像scanf一样写出来,然后再在前面加上一个FILE * 的参数就好了。而对于参数我们可以再对比一下,前面的fscanf就是多了一个FILE *的指针,而现在这里就是改成了字符指针,也就是从字符指针中读一个数据,到后面的格式化数据里面去。而对于这个函数参数,我们参照printf转换发现,这里就是多了一个字符指针,也就是从后面的输出的格式化中读数据,到前面的字符指针里面去。
C语言scanf/fscanf/sscanf以及printf/fprintf/sprintf区别
fufufu_的博客
10-12 984
sscanf sprintf
scanf/fscanf/sscanfprintf/fprintf/sprintf的使用和对比
shylyly_的博客
03-30 1113
scanf/fscanf/sscanfprintf/fprintf/sprintf的使用和对比
C语言scanf和sscanf,sscanf函数scanf函数区别
weixin_39966765的博客
05-25 790
sscanfscanf类似,都是用于输入的,只是后者以键盘(stdin)为输入源,前者以固定字符串为输入源。sscanf可以实现更丰富的功能,最起眼的应该是类似于正则表达式的功能:第一个参数可以是一个或多个 {%[*] [width] [{h | l | I64 | L}]type | ' ' | '\t' | '\n' | 非%符号}1、 * 亦可用于格式中, (即 %*d 和 %*s) 加了...
sscanfscanf的用法区别
weixin_34221332的博客
07-05 439
1.sscanf() - 从一个字符串中读进与指定格式相符的数据.2.函数原型:   Int sscanf( const char *, const char *, ...);   int scanf( const char *, ...);3.sscanfscanf类似,都是用于输入的,只是后者以键盘(stdin)为输入源,前者以固定字符串为输入源。常见用...
sscanfscanf
weixin_42388551的博客
07-26 1357
下面总结了sscanf的以及sscanf_s的常用方法,也体现了“_s”版本函数与原函数的特别之处: 1、sscanfscanf的不同是输入来源,前者是一个字符串,后者则是标准输入设备 2、sscanf的使用,以解析时间字符串为例,将字符串“2009-01-02_11:12:13”解析为整型年月日时分秒 //定义 char cc; tm tm_temp={0}; string stime(“20...
C语言】输入函数们的盘点:scanf、getchar、getch、getche、gets
weixin_44211968的博客
10-09 1696
文章目录C 库函数 - scanf():C 库函数 - getchar():getch:getche:getchar(),getch(),getche()比较:gets:参考链接: C 库函数 - scanf(): 功能: scanf函数从标准输入 stdin 读取格式化输入。 和getchar类似,首先从stdin缓冲区读取字符,如果缓冲区有符合格式要求的数据,及获取数据,返回给程序,指针指向下一个数据,函数结束;如果缓冲区没有符合要求的数据,则等待从键盘输入数据,并且必须以回车键结束,输入的数据存入s
sscanfscanf的比较与使用
dadalan的专栏
02-23 849
sscanf() - 从一个字符串中读进与指定格式相符的数据.函数原型:Int sscanf( const char *, const char *, ...);int scanf( const char *, ...);头文件:#include说明:sscanfscanf类似,都是用于输入的,只是后者以键盘(stdin)为输入源,前者以固定字符串为输入源。第一个参数
fprintf+和fscanf
11-09
fprintffscanfC语言中的文件输入输出函数,可以用于读写文件。其中,fprintf函数可以将格式化的数据...另外,sscanfsprintf函数也类似于fscanf和fprintf函数,只不过它们是将数据读写到字符串中,而不是文件中。
写文章

热门文章

  • C语言实现--图书管理系统+附详细代码分析过程 18483
  • C语言实现--学生信息管理系统+附详细代码分析过程 18373
  • C语言实现--通讯录管理系统+附详细代码分析过程 16913
  • 全网最详细的字符串函数介绍---strcpy、strcat、strcmp 7774
  • 学生信息管理系统--进阶(动态开辟内存 + 保存数据到文件) 7288

分类专栏

  • 项目 5篇
  • 生涯历程 2篇
  • JavaEE进阶 14篇
  • JavaEE初阶 44篇
  • JavaSE 13篇
  • C语言详解 35篇
  • MySQL 5篇
  • 数据结构(C语言详解) 32篇
  • 数据结构教材全书详细笔记总结(c语言版严蔚敏编) 31篇
  • 数据结构(Java详解)

最新评论

  • 一分钟 帮你搞懂什么是柔性数组!

    coder gogo: 博主牛的,表达明确有条理!但是有个疑问,这里只是用了*ptr指针做模拟来进行对比。如果是换成[code=csharp] int[12] arr; [/code] 这样的已知长度的数组,它在释放内存和产生内存碎片上的表现是不是还是一样呢或者会更差呢?

  • Redis---保证主从节点一致性问题 +与数据库数据保持一致性问题

    CSDN-Ada助手: MySQL入门 技能树或许可以帮到你:https://edu.csdn.net/skill/mysql?utm_source=AI_act_mysql

  • C语言实现--图书管理系统+附详细代码分析过程

    2401_82374503: 这里面使用了链表嘛?

  • 图书管理系统--进阶(动态开辟内存 + 保存数据到文件)

    2301_81516958: 没有主函数吗呜呜呜

最新文章

  • Redis---保证主从节点一致性问题 +与数据库数据保持一致性问题
  • SpringMVC---详细介绍+使用
  • SpringMVC---获取参数
2024年1篇
2023年179篇
2022年1篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值

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

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