【C语言】scanf/fscanf/sscanf以及printf/fprintf/sprintf的区别

28 篇文章 3 订阅
订阅专栏

1. 前言

我们在最初接触C语言的时候,用的最多的可能是printf这个函数

printf("Hello World");

以及scanf这个函数

int a = 0;
scanf("%d",&a);

我们在初学时,可能并不会过多讨论这两个函数更深层的理解。只需要知道怎么用就可以了。
这是初学阶段,庄子中有句话叫

                      知其然而不知所以然

但是随着我们对事物了解的越多,发现了很多事物都有一些共性和特点
我们就会想更深一层了解他们。
C语言里面,随着我们学习到文件操作的部分,我们就会了解到这两组函数。

                      scanf/fscanf/sscanf
                      printf/fprintf/sprintf
                     
             它们仅仅相差了一个字母,它们的区别是什么呢?
             让我们来逐一刨析一下

2.scanf 和 printf

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

                                   什么是标准输入流和标准输出流?

如果有不了解关于C语言文件操作的同学,可以去看看这篇文章
文件操作总结
在这里插入图片描述

如果我们想从内存写数据到文件中,就要打开流,这是普通的输出流
如果我们想从文件读数据到内存中,也要打开流,这是普通的输入流
而我们这里的标准输入流(stdin),对应操作(显示)位置是键盘,是默认打开的
同理,我们这里的标准输出流(stout),对应操作(显示)是屏幕,也是默认打开的
不需要我们像执行文件操作那样,特意去写代码去fopen文件,再调用函数

2.1 scanf函数

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

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

所谓的格式化的数据就是
 从标准输入流(stdin)读取数据,并根据**参数格式**将它们存储到*附加参数*所指向的位置。
就是要求你按照一定格式去写代码,才能写入数据到指向的位置
比如 %d %s %lf等格式说明符
附加参数应该指向已分配的对象(即附加参数应该是一个地址或者是指针)
                                 例如,看下面的代码
scanf("%d",&input);
//scanf("%d",input);//错误的写法
这里的意思是scanf函数以%d的格式从标准输入流中读入的数据存储到&input所指向的空间。

2.2 printf 函数

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

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

printf是将format指向的C字符串写入标准输入流。
如果format包含格式说明符,则format后面的附加参数将被格式化并插入结果字符串中,以替换它们各自的说明符。
                                                            来看一下下面这个例子就懂了
//平常不会用到的写法(根据上面的解释这样写也是可以的):
char arr[] = "hello";
printf(arr);//将指向的C字符串写入标准输入流
//如果后面没有附加参数的话,printf将直接将这个字符串打印到标准输入流。
//平时的写法:
char arr[] = "hello";
printf("%s",arr);
//后面有附加参数的话,附加参数所指向的字符串被替换到各自的说明符

3.fscanf 和 fprintf

3.1 fscanf 可以实现scanf的功能

文件操作函数,不懂可以去看看前面提到的那篇文章,我们这里不做详细使用方法和介绍
int fscanf ( FILE * stream, const char * format, ... );

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

好好推敲一下这句话,所有输入流和所以输出流,那意思是不是就包含我们的标准输入流(stdin)和标准输出流(stout)
函数参数里的FILE * stream,可以写我们的标准输入流(stdin,就可以实现scanf的功能。
就是说:
fscanf(stdin,%d,&input);
scanf("%d",&input);
//这两个函数现在可以实现相同的功能

3.2 fprintf 实现printf的功能

int fscanf ( FILE * stream, const char * format, ... );
和fscanf解释同理,
只要我们将FILE * stream 写成我们的标准输出流(stout),就可以实现我们printf的功能。
fprintf(stout,"%d",input);
printf("%d",input);
//这两个函数现在可以实现相同的功能

4.sscanf 和 sprintf

前面我们讲的 fscanf 和 fprintf,两者都是以f开头的,代表file,文件。
那我们这里的 sscanf 和 sprintf 两者都是以s开头的,代表string,字符串。
可见,这组函数是和操作字符串有关的。

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

4.1 sscanf

int sscanf ( const char * s, const char * format, ...);
sscanf 是从字符串s中读取格式化地读取数据,存储到附加参数指定的位置。
                                       看个例子就明白了
    char arr[] = "hello 123";
	char arr2[10] = { 0 };
	int num = 0;
	//从字符串arr中根据%s %d格式化地读取数据,分别存储到arr2和&num
	sscanf(arr, "%s %d", arr2, &num);
	
	printf("%s %d", arr2, num);//hello 123

在这里插入图片描述

就是从区域1,以区域2的格式读取数据,最终存储到区域3所指向的空间

4.2 sprintf 函数

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

sprintf函数是将数据格式化之后,存储在str所指向的字符串中

                                          看个例子就明白了
    char arr1[] = "hello";
	int num = 123;
	char arr2[20] = { 0 };
	//将附加参数arr1,num,以%s %d 的格式读取数据,存储在arr2中
	sprintf(arr2, "%s %d", arr1, num);
	
	printf(arr2);//hello 123

在这里插入图片描述

就是从区域3中,以区域2的格式读取数据,存在区域1

5.总结

经过上面的刨析,我们可以对这三组函数进行总结了。
scanf 和 printf 用于标准输入流(stdin)和标准输出流(stout)的格式化输入输出语句
fscanf 和 fprintf 用于所有输入流和标准输出流的格式话输入输出语句,可以实现scanf 和 printf的功能
sscanf 和 sprintf 用于字符串和数据之间的转换
Go 学习笔记(46)— Go 标准库之 fmt(输入/输出格式化参数、Printf/Fprintf/Sprintf区别、Println/Fprintln/Sprintln 区别
wohu1104的专栏
06-05 4302
1. 概述 import "fmt" fmt 包实现了类似 C 语言 printfscanf 的格式化 I/O 。格式化动作( verb )源自 C 语言但更简单。 2. Printing 格式化 2.1 通用格式 格式化标记 格式化含义 %v 值的默认格式表示 %+v 类似%v,但输出结构体时会添加字段名 %#v 值的类型的Go语法表示 %% 百分号 代码示例: package main import "fmt" type Person struct { Na
sscanfsprintf 区别
ZL941208的博客
06-12 319
sscanfsprintf
C语言sprintf与sscanf函数[总结]
weixin_34221036的博客
10-04 371
1、前言     我们经常涉及到数字与字符串之间的转换,例如将32位无符号整数的ip地址转换为点分十进制的ip地址字符串,或者反过来。从给定的字符串中提取相关内容,例如给定一个地址:http://www.bokeyuan.cn:2345,我们要从地址中提出协议,主机地址和端口号。之前对字符串和数字之间的关系不是很熟悉,工作中经常涉及到这个,如是好好总结一下。C语言提供了一些列的格式化输入输出函数...
scanfprintffscanf、fprintf、sscanfsprintf
风声
01-13 1998
scanf 从stdin输入指定格式的参数到变量         int scanf (__const char *__restrict __format, ...) __wur;  (...是边长的变量参数)printf 将变量以指定格式输出到stdout         int printf (__const char *__restrict __format, ...);fscanf 从文件输入指定格式的参数到变量          int fscanf (FILE *__restrict __str
scanf[^\n]/fscanf 的%[]和%n使用方法
aaaa255116的博客
10-22 2327
标准输入输出函数%[]和%n说明符的使用方法    scanf fscanf,均从第一个非空格的可显示字符开始读起!         标准输入输出函数scanf具有相对较多的转换说明符,它常常作为入门级函数出现在各种教材中。但奇怪的是,[]和n这两种都为c89/c99所规定的标准说明符却鲜少在大多数教材中出现。虽然[]和n说明符的使用频率不及其它说明符,但两者在程序设计中的作用仍然不可小视,尤
scanf/fscanf/sscanfprintf/fprintf/sprintf的使用和对比
shylyly_的博客
03-30 1113
scanf/fscanf/sscanfprintf/fprintf/sprintf的使用和对比
C语言scanf/fscanf/sscanf printf/fprintf/sprintf 函数对比
mlisda的博客
01-16 1032
scanf/fscanf/sscanf printf/fprintf/sprintf
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`,...
浅析C语言printf(),sprintf(),scanf(),sscanf()的用法和区别
09-05
以下是对C语言printf(),sprintf(),scanf(),sscanf()的用法以及区别进行了详细的分析介绍,需要的朋友可以参考下
scanf/fscanf/sscanfprintf/fprintf/sprintf函数的对比
qq_47882731的博客
02-19 1131
文章目录1.1 printf(将数据打印到屏幕上)1.2 scanf(从键盘获取数据)2.1 fprintf(将数据打印到文件中)2.2 fscanf(从文件中获取数据)3.1 sprintf(将结构体数据转化成字符串)3.2 sscanf(将字符串中内容转变成结构体信息) 1.1 printf(将数据打印到屏幕上) 从标准输入流(stdin)上进行格式化输入的函数 例子 #include<stdio.h> int main() { printf("hello\n"); int i=100;
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语言sscanffscanfscanfsprintf、fprintfprintf函数的区别与相似分析
2301_80038635的博客
01-25 1523
实际上fscanf就多了一个FILE * 的参数,也就是打开的文件的地址参数,所有当我们进行使用的时候,我们可以先像scanf一样写出来,然后再在前面加上一个FILE * 的参数就好了。而对于参数我们可以再对比一下,前面的fscanf就是多了一个FILE *的指针,而现在这里就是改成了字符指针,也就是从字符指针中读一个数据,到后面的格式化数据里面去。而对于这个函数参数,我们参照printf转换发现,这里就是多了一个字符指针,也就是从后面的输出的格式化中读数据,到前面的字符指针里面去。
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
sscanfscanf区别
最新发布
海涛高软
04-24 221
在使用sscanf函数时,要确保格式字符串与要解析的数据格式匹配,否则可能会导致解析错误或未定义的行为。sscandf 从字符串中提取数据。scanf 标准输入流读取数据。
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
scanffscanf
wo.a的博客
04-02 3002
遇到一个问题:如果有一串数据   如mac地址 aa:bb:cc:33:12:34 要把这个存到一个数组里这么做?                     或者说把这个输出为aabbcc331234 怎么做当时我想了很多关于字符串的函数,但是都太复杂  什么字符串截取之类的 乱七八糟叭后来就被问了: 你知道 scanffscanf 函数吗? -----------好叭 显然我就知道scanf...
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
写文章

热门文章

  • 栈的介绍 什么是栈? 12528
  • 【C语言】深度理解-取整 6887
  • 简单概括什么是线性结构和非线性结构 6801
  • 关于为什么2147483647加1后会变成-2147483648 6244
  • 【C语言】深度理解 负数取余 取模 5914

分类专栏

  • Linux 35篇
  • 项目 1篇
  • 数据结构与算法 20篇
  • 测试 1篇
  • Qt 5篇
  • C/C++ 28篇
  • MySQL学习笔记 10篇
  • 其他 1篇

最新评论

  • 利用int和long long数据类型最多可以算到的阶乘

    2401_83205795: 50! = -3258495067890909184 ???

  • 【C++】命名空间(namespace) 以及理解using namespace std

    夏℡沐瑾: 强啊强啊

  • 解决在云服务器开放端口号以后telnet还是无法连接的问题

    逐梦: 没有控制台,在防火墙开不了3000/20000端口怎么办

  • 【C语言】栈区 堆区 静态区 代码段

    非人类_: 示例中char char2[] ="abcd"; abcd应该是栈上分配的吧

  • 【算法篇-搜索与图论】适合算法入门小白理解的深度优先搜索(DFS )以及解决全排列数字

    如果不出意外那一定是出了意外: 通俗易懂,完全明白

最新文章

  • Linux 读写锁
  • Qt人脸识别与分析系统
  • Selenium自动化测试 常见API的使用
2024年9篇
2023年64篇
2022年39篇
2021年1篇

目录

目录

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

有心栽花无心插柳

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

¥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 网站制作 网站优化