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

news/2024/10/23 9:34:52/

文章目录

  • 前言
  • 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);//2021printf("%s\n", s);//dragonreturn 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 worldreturn 0;
}

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

在这里插入图片描述

总结

在这里插入图片描述


http://www.ppmy.cn/news/545625.html

相关文章

五一放假不想人挤人?下载植物大战僵尸中文版玩起来

植物大战僵尸中文版 for Mac推荐给大家&#xff01;此版本完美兼容macos big sur 11系统&#xff01;植物大战僵尸mac版将经典策略塔防玩法发挥到了极致&#xff0c;无论是防御方的植物种类&#xff0c;还是进攻的僵尸类型都非常丰富&#xff0c;游戏关卡多样&#xff0c;结合冒…

植物大战僵尸2 服务器维护时间,植物大战僵尸2:老玩家给平民党的7点忠告,不氪金也能玩到通关!...

植物大战僵尸从第1代开始&#xff0c;到现在的第2代&#xff0c;已经陪伴我们快要10年啦。小王子自己也是植物大战僵尸的铁忠粉&#xff0c;对于这款游戏也有一些自己的心得体会。如果你也是跟小王子一样&#xff0c;是个支持玩正版&#xff0c;不氪不肝的玩家&#xff0c;那么…

C语言实现植物大战僵尸自动收集阳光(三) 解决收集不全与收集奖杯卡死的问题

C语言实现植物大战僵尸自动收集阳光(一) 问题分析与寻找基址 C语言实现植物大战僵尸自动收集阳光(二) C语言控制台程序的实现 C语言实现植物大战僵尸自动收集阳光(三) 解决收集不全与收集奖杯卡死的问题 前言 上一篇中&#xff0c;我们已经用C语言通过对进程内存的读者操作&a…

用Java写一个植物大战僵尸简易版!

点击上方蓝色“程序猿DD”&#xff0c;选择“设为星标” 回复“资源”获取独家整理的学习资料&#xff01; 来源 | https://urlify.cn/byeEjy 有谁没玩过植物大战僵尸吗&#xff1f;用Java语言开发了自己的植物大战僵尸游戏。虽然系统相对简单&#xff0c;但是麻雀虽小五脏俱全…

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;查看最新版。原创作品&#…

C++ 重制植物大战僵尸(Cocos2dx开源项目)

游戏简介&#xff1a; 此游戏全部由哔哩哔哩"尔领尔亿"&#xff08;LZ&#xff09;独立制作完成。此游戏与当前可以见到的众多改版不同。此程序不是基于原版游戏的二次开发&#xff0c;而是从新从零开始制作。该程序使用Cocos2dx游戏开发框架以及C语言制作完成。目…

不要迷恋我,虽然我利用Python来耍植物大战僵尸,威力加强版

前言 大家好&#xff0c;我叫善念。上篇文章我许了一个愿&#xff0c;就是想让大家多多关注我&#xff0c;然后我的粉丝就蹭蹭的涨了好几百&#xff0c;谢谢大家的厚爱。可是我发现粉丝是涨了&#xff0c;三连变少了&#xff0c;谢谢大家这次给我三连&#xff0c;我一定再接再厉…

Qt开发植物大战僵尸第一篇

Qt学习与开发 “ 第一次写博客&#xff0c;尝试将自己的思路记录下来。” Qt环境配置 一个挺巧妙的机会能接触到Qt&#xff0c;Qt是一个构建人机交互界面的很好的工具&#xff0c;首先我们需要配置好Qt环境。Qt下载链接link&#xff0c;一般选择5.9以上版本&#xff0c;然后安…