C语言 scanf/fscanf/sscanf 和 printf/fprintf/sprintf 区别

看了B站上比特鹏哥的C语言视频,在讲到“文件操作”章节内容的时候,讲到了对比 scanf/fscanf/sscanf 和 printf/fprintf/sprintf 这6个函数,觉得讲的不错,理解起来比起其他文章更加通俗易懂,所以记录下来,分享给大家。

代码运行环境:window10,visual studio 2019

 

结论:

scanf / printf

是针对标准输入流/标准输出流的 格式化输入/输出语句  (这里的标准输入流针对的是stdin,指的是从键盘获取的输入数据,标准输出流针对的是stdout,是指从屏幕打印出来的数据)
fscanf / fprintf

是针对所有输入流/所有输出流的 格式化输入/输出语句(这里所有输入流出了包含标准的输入流外,还包含文件输入流,所有输出流包含了标准的输出流外,还包含文件输出流)
sscanf / sprintf

sscanf是从字符串中读取格式化的数据(简单的理解,就是从字符串中提取想要的信息在转换成格式化的数据)

sprintf是把格式化数据输出成(存储到)字符串(简单的理解,就是提取格式化数据中想要的信息转换成字符串)

 

代码示例:

1. scanf / printf (针对标准输入流 stdin / 标准输出流 stdout)

 1 #define _CRT_SECURE_NO_WARNINGS 1
 2 #include <stdio.h>
 3 
 4 struct S {
 5     int n;
 6     float score;
 7     char arr[10];
 8 };
 9 
10 int main() {
11     struct S s = { 0 };
12     scanf("%d %f %s", &(s.n), &(s.score), s.arr);  // 从键盘输入数据
13     printf("%d,%f,%s", s.n, s.score, s.arr);  // 从控制台输出数据
14     return 0;
15 }

代码运行结果:

 

2. fscanf / fprintf (针对所有输入流 / 所有输出流)

(1)文件流的格式化输入

 1 #define _CRT_SECURE_NO_WARNINGS 1
 2 #include <stdio.h>
 3 
 4 struct S {
 5     int n;
 6     float score;
 7     char arr[10];
 8 };
 9 
10 int main() {
11     struct S s = { 100, 3.14f, "bit" };  // 如果不加f,就默认是double类型
12     FILE* pf = fopen("test.txt", "w");
13     if (pf == NULL) {
14         return 0;
15     }
16     // 格式化的形式写文件
17     fprintf(pf, "%d %f %s", s.n, s.score, s.arr);
18 
19     fclose(pf);
20     pf = NULL;
21     return 0;
22 }

(2)文件流的格式化输出

 1 #define _CRT_SECURE_NO_WARNINGS 1
 2 #include <stdio.h>
 3 
 4 struct S {
 5     int n;
 6     float score;
 7     char arr[10];
 8 };
 9 
10 int main() {
11     struct S s = { 0 };  // 这边数据放0,因为希望读一个信息放入s中
12     FILE* pf = fopen("test.txt", "r");
13     if (pf == NULL) {
14         return 0;
15     }
16     // 格式化的输入数据
17     fscanf(pf, "%d %f %s", &(s.n), &(s.score), s.arr);
18     printf("%d, %f, %s\n", s.n, s.score, s.arr);
19 
20     fclose(pf); 
21     pf = NULL;
22 
23     return 0;
24 }

代码运行结果:

(3)标准输入流和输出流的格式化输入输出

 1 #define _CRT_SECURE_NO_WARNINGS 1
 2 #include <stdio.h>
 3 
 4 struct S {
 5     int n;
 6     float score;
 7     char arr[10];
 8 };
 9 
10 int main() {
11     struct S s = { 0 };
12 
13     fscanf(stdin, "%d %f %s", &(s.n), &(s.score), s.arr);
14     fprintf(stdout, "%d %f %s", s.n, s.score, s.arr);
15 
16     return 0;
17 }

代码运行结果:

 

3. sscanf / sprintf (字符串和格式化数据相互转换)

 1 #define _CRT_SECURE_NO_WARNINGS 1
 2 #include <stdio.h>
 3 
 4 struct S {
 5     int n;
 6     float score;
 7     char arr[10];
 8 };
 9 
10 int main() {
11     struct S s = { 100, 3.14f, "abcdef" };
12     char buf[1024] = { 0 };  
13     // 把格式化的数据转换成字符串存储到buf,通过使用sprinf:把一个格式化的数据写到字符串中去
14     sprintf(buf, "%d - %f - %s", s.n, s.score, s.arr);
15     printf("%s\n", buf);
16 
17     struct S tmp = { 0 };
18     // 从buf中读取格式化的数据到tmp中
19     sscanf(buf, "%d - %f - %s", &(tmp.n), &(tmp.score), tmp.arr);  // 读取的时候格式要相对应: - -
20     printf("%d, %f, %s\n", tmp.n, tmp.score, tmp.arr);
21 
22     return 0;
23 }

代码运行结果:

 

 

参考资料: https://www.bilibili.com/video/BV1q54y1q79w?p=73&vd_source=acfeb201256ec13951609fc4eebb2ca0

posted @ 2022-07-22 10:41  ttweixiao9999  阅读(407)  评论(0编辑  收藏  举报