【11】C实战篇——C语言 【scanf、printf、fprintf、fscanf、sprintf、sscanf】的区别

文章目录

  • 4 格式化输入输出
    • 4.1 格式化写 fprintf
    • 4.2 格式化读 fscanf
    • 4.3 数据转化为字符串 sprintf
    • 4.3 字符串的数据还原 sscanf

4 格式化输入输出

前边介绍的方法都是字符的读写,

而fprintf 和fscanf是对数据进行格式读写,

除此之外还有sscanf和sprintf

我们可以来对比一下这几个函数:

  • scanf 从标准输入流读取格式化的数据。
  • printf 向标准输出流写格式化的数据。
  • fscanf 适用于所有输入流的格式化输入函数
  • fprintf 适用于所有输出流的格式化输出函数
  • sprintf 将格式化的数据写入到字符串中(将格式化的数据转化为字符串),可以将任何类型的数据转换成字符串;
  • sscanf将转换成字符串的数据还原 ,(sprintf将数据转换成字符串,sscanf将数据还原。)

4.1 格式化写 fprintf

fprintf 适用于所有输出流的格式化输出函数

cpp 复制代码
#include<stdio.h>

struct S {
	int a;
	float s;
};

int main()
{
	FILE* pf = fopen("data.txt", "w");//注意,读写时操作不同,注意修改
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	struct S s = { 100,3.14f };
	//写入到文本
	fprintf(pf, "%d %f", s.a, s.s);

	fclose(pf);
	pf = NULL;
	return 0;
}

它可以将不同格式的数据输出到指定位置。fprintf 和printf很类似,就是前边加上输出的位置。

运行成功后,打开文件就可以看到100,3.140000出现在文件中。

4.2 格式化读 fscanf

fscanf 适用于所有输入流的格式化输入函数。

既然有格式化输出,那就必然有从文件中输入。

cpp 复制代码
struct S {
	int a;
	float s;
};

int main()
{
	FILE* pf = fopen("data.txt", "r");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	struct S s = { 0 };
	fscanf(pf, "%d %f", &(s.a), &(s.s));
	printf("%d %f", s.a, s.s);
	fclose(pf);
	pf = NULL;
	return 0;
}

读取之前保存的数据,屏幕上就会输出文件中的数据。

fscanf和我们经常适用的scanf也很相似,只是多了一个读取数据的位置。

4.3 数据转化为字符串 sprintf

sprintf 将格式化的数据写入到字符串中(将格式化的数据转化为字符串),可以将任何类型的数据转换成字符串;

cpp 复制代码
struct S {
	int a;
	float s;
	char str[20];
};
int main()
{
	char ch[30] = { 0 };
	struct S s = { 100,3.14f,"hello world" };
	sprintf(ch, "%d %f %s", s.a, s.s, s.str);
	return 0;
}

通过调试,观察ch中的数据:

可以观察到它确实将数据转化成了字符串,并存放到了数组当中。

sprintf和printf也很类似,只需在前边添加要存放的数组。

4.3 字符串的数据还原 sscanf

sprintf 将数据转换成字符串,sscanf将数据还原。通过结构体访问成员进而输出。

cpp 复制代码
struct S {
	int a;
	float s;
	char str[20];
};
int main()
{
	char ch[30] = { 0 };
	struct S s = { 100,3.14f,"hello world" };
	struct S t = { 0 };
	sprintf(ch, "%d %f %s", s.a, s.s, s.str);

	sscanf(ch, "%d %f %s", &(t.a), &(t.s), &(t.str));
	printf("%d %f %s\n", t.a, t.s, t.str);
	return 0;
}

sscanf其实也是和scanf很像,它仅仅是在前边添加了一个转换的数组地址。

相关推荐
Zwawa7 小时前
先把轮子转稳,才不会烧心:编码器速度环 PID 怎么接回 PWM
c语言·单片机·嵌入式
Escalating_xu11 小时前
【C 语言】编译和链接:从源文件、目标文件到可执行程序完整解析
c语言·开发语言
C++ 老炮儿的技术栈11 小时前
std::atomic 是什么
linux·c语言·网络·c++·visual studio
Logic10112 小时前
C语言/数据结构位运算题解:异或XOR找出数轴移动中只出现一次的指令——只出现一次的数字
c语言·数据结构·数组·位运算·时间复杂度·算法题·异或性质
weixin_4629019712 小时前
CubeIDE串口重定向 printf
c语言
人邮异步社区13 小时前
C语言好学,还是Python好学?
c语言·开发语言·python
水饺编程15 小时前
第2章:Linux 基础,echo 命令
linux·c语言·汇编
晓蛋16 小时前
C语言中定义常量为什么要加后缀
c语言·溢出·常量定义·后缀·类型限定
Logic10116 小时前
C语言/数据结构贡献法题解:数组权值——所有连续子数组中不同数字个数之和(O(n)解法)
c语言·数据结构·算法·数组·时间复杂度·贡献法·哈希记录
Code_Solitude17 小时前
C语言分支结构练习题(华师版)
c语言·开发语言