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

发布于:2022-10-12 ⋅ 阅读:(383) ⋅ 点赞:(0)

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 用于字符串和数据之间的转换

网站公告

今日签到

点亮在社区的每一天
去签到