【C语言】scanf/fscanf/sscanf以及printf/fprintf/sprintf的区别
文章目录
- 1. 前言
- 2.scanf 和 printf
- 2.1 scanf函数
- 2.2 printf 函数
- 3.fscanf 和 fprintf
- 3.1 fscanf 可以实现scanf的功能
- 3.2 fprintf 实现printf的功能
- 4.sscanf 和 sprintf
- 4.1 sscanf
- 4.2 sprintf 函数
- 5.总结
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 用于字符串和数据之间的转换
2401_83205795: 50! = -3258495067890909184 ???
夏℡沐瑾: 强啊强啊
逐梦: 没有控制台,在防火墙开不了3000/20000端口怎么办
非人类_: 示例中char char2[] ="abcd"; abcd应该是栈上分配的吧
如果不出意外那一定是出了意外: 通俗易懂,完全明白