C语言scanf,fscanf和sscanf的区别

目录
  • 一.scanf,fscanf和sscanf
    • 1.scanf
    • 2.fscanf
    • 3.sscanf
  • 二.printf,fprintf和sprintf
    • 1.printf
    • 2.fprintf
    • 3.sprintf

一.scanf,fscanf和sscanf

1.scanf

首先scanf我们的很熟悉,他就是从键盘上输入数据,准确的来说就是:

从标准输入(键盘)读取格式化的数据。

int main()
{
	int x = 0;
	scanf("%d", &x);
	return 0;
}

2.fscanf

而fscanf就比scanf高级了一点,可以说是fscanf包含了scanf的功能,对于这个函数的定义是这样子的:

从所有的输入流读取格式化的数据。

我们可以查看一下fscanf-cpulspuls中的解释和参数:

释义:从流中读取数据,并根据参数格式将它们存储到附加参数所指向的位置。附加参数应指向格式字符串中的相应格式说明符指定的类型已分配的对象。

int fscanf ( FILE * stream, const char * format, ... );

这里的参数如果看不懂,我们就可以进行对比去学习,我们可以打开scanf的说明去看一下对比一下:

实际上fscanf就多了一个FILE * 的参数,也就是打开的文件的地址参数,所有当我们进行使用的时候,我们可以先像scanf一样写出来,然后再在前面加上一个FILE * 的参数就好了。

例子:

我们可以打开文件,在输入流中读取到数据,然后打印出来看看:

//fscanf
struct S
{
	int n;
	double d;
};
int main()
{
	struct S s = {0};
	FILE* pf = fopen("data.txt", "r");//文本文件data.txt
	if (NULL == pf)
	{
		perror("fopen");
		return -1;
	}
	//读文件
	fscanf(pf, "%d %lf", &(s.n), &(s.d));
	printf("%d %lf\n", s.n, s.d);
	//关闭文件
	fclose(pf);
	pf = NULL;
}

3.sscanf

老规矩,我们查一下这个函数的定义:

这里的意思就是从字符串中读取到格式化的数据,也就是说我们输入进去的数据,sscanf会转化成字符串的形式。也就是:

从字符串中读取一个格式化的数据。

int sscanf ( const char * s, const char * format, ...);

而对于参数我们可以再对比一下,前面的fscanf就是多了一个FILE *的指针,而现在这里就是改成了字符指针,也就是从字符指针中读一个数据,到后面的格式化数据里面去。

例子:

从字符数组里面拿数据进结构体,然后打印出来(这里要先理解下面的sprintf然后一起看):

struct S
{
	int n;
	double d;
	char name[10];
};
int main()
{
	char arr[100] = { 0 };
	struct S tmp = { 0 };
	struct S s = { 100, 3.14, "zhangsan" };
	//把一个格式化的数据转换成字符串
	sprintf(arr, "%d %lf %s", s.n, s.d, s.name);
	//打印
	printf("%s\n", arr);
	//从arr中的字符串中提取出一个格式化的数据
	sscanf(arr, "%d %lf %s", &(tmp.n), &(tmp.d), tmp.name);
	//打印
	printf("%d %lf %s\n", tmp.n, tmp.d, tmp.name);
	return 0;
}

二.printf,fprintf和sprintf

1.printf

printf就是一个打印函数,从键盘上输出,对于它来说就是:

把格式化的数据到标准输出(屏幕)上

int main()
{
	int x = 0;
	printf("%d", x);
	return 0;
}

2.fprintf

fprintf同样是比printf高级一点,它可以输出到更多的地方,也就是包括着printf的功能,他的定义是:

把格式化的数据输出到所有输出流(屏幕/文件)上

同样的我们可以先查一下fprintf - cplusplus:

释义:将按格式指向的C字符串写入流。如果格式包括格式说明符(从%开始的子序列),则格式化后的附加参数将被格式化并插入到结果字符串中,替换各自的说明符。

int fprintf ( FILE * stream, const char * format, ... );

同样经过对比之后,我们发现fprintf和printf也就是差了一个FILE *的参数,所以我们同样可以先按照printf的格式写,然后再加上参数,就可以很好的使用fprintf了。

例子:

这里将一些值输出到文件上,也就是当我们运行完代码之后,文件上就会拥有这些数据:

//fprintf(按某一种格式写入)
struct S
{
	int n;
	double d;
};
int main()
{
	struct S s = { 100, 3.14 };
	FILE* pf = fopen("data.txt", "w");//写入文本文件data.txt
	if (NULL == pf)
	{
		perror("fopen");
		return -1;
	}
	//写文件
	fprintf(pf, "%d %lf", s.n, s.d);
	//关闭文件
	fclose(pf);
	pf = NULL;
}

3.sprintf

对于ssprintf,还是先看定义:

释义:在printf上使用格式时,使用相同的文本组成字符串,但内容不是打印出来,而是存储在str指向的缓冲区中的C字符串中。

实际上这里的意思就是:

把格式化的数据输出转换成字符串。

int sprintf ( char * str, const char * format, ... );

而对于这个函数参数,我们参照printf转换发现,这里就是多了一个字符指针,也就是从后面的输出的格式化中读数据,到前面的字符指针里面去。然后输出得到的就是字符串。

例子:

打印结构体的多种类型的数据:

struct S
{
	int n;
	double d;
	char name[10];
};
int main()
{
	char arr[100] = { 0 };
	struct S tmp = { 0 };
	struct S s = { 100, 3.14, "zhangsan" };
	//把一个格式化的数据转换成字符串
	sprintf(arr, "%d %lf %s", s.n, s.d, s.name);
	//打印
	printf("%s\n", arr);
    return 0;
}

我们以%s打印的,打印出来了:

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注我们的更多内容!

(0)

相关推荐

  • C语言中的fscanf()函数与vfscanf()函数使用

    C语言fscanf()函数:输入函数(比较常用) 头文件: #include <stdio.h> 定义函数: int fscanf(FILE * stream, const char *format, ...); 函数说明:fscanf()会自参数stream 的文件流中读取字符串, 再根据参数format 字符串来转换并格式化数据.格式转换形式请参考scanf(). 转换后的结构存于对应的参数内. 返回值:成功则返回参数数目, 失败则返回-1, 错误原因存于errno 中. 范例 #incl

  • c语言 sscanf,scanf,fscanf正则表达式用法

    每种语言都对正则表达式有着不同程度的支持,在C语言中,有输入功能的这三个函数对正则表达式的支持并不强大,但是我们还是有必要了解一下. 首先来看看他们的原型: #include <stdio.h> int scanf(const char *format, ...); int fscanf(FILE *stream, const char *format, ...); int sscanf(const char *str, const char *format, ...); 均可以接受变参,ss

  • C语言使用scanf连续输入字符串出现的问题

    #include<stdio.h> int main() { char a,b; scanf("%c",&a): scanf("%c",&b); printf("%c,%c",a,b); } 一段看上去很简单的代码,即使是C语言初学者也能看懂. 可是在运行的时候却出现了问题: ①输入a后按下回车 ②用空格隔开之后再按下回车 相信和我一样的大部分初学者,看着自己天衣无缝的代码,百思不得其解. 让我们先来看看,在百度百科中

  • C语言中fgets和fscanf区别详解

    C语言中fgets和fscanf区别详解 一.作用上的大概区别: ①fgets:从文件中读取一行数据存入缓冲区(fgets遇到回车才会结束,不对空格和回车做任何转换就录入到缓冲区,结束后再往缓冲区写多一个\0,所以它是读一行数据) ②fscanf:从文件中读取一段数据存入缓冲区(fscanf遇到空格或回车就结束,它会把空格或回车转换为\0,所以它是读一小段数据) 二.举个例子:把a.txt文件中的内容复制到b.txt. a.txt中的内容(第一行中"我爱你小白"和"开玩笑&q

  • c语言中scanf的基本用法

    前言 scanf()是C语言的格式输入函数,和printf函数一样被声明在stdio.h头文件中,它的基本使用很简单: 1 int a; 2 scanf("%d",&a);//程序执行到这里时,就等待用户输入:它接收的是变量的地址 //所以一般情况下除了指针型变量和数组名要给变量加上取地址符& 下面主要介绍了C语言中scanf的用法和注意事项,下面来一起看看详细的介绍吧 scanf概念 scanf是格式输入函数,功能是在屏幕上输入指定的信息.简单的来说和printf相似

  • C语言scanf,fscanf和sscanf的区别

    目录 一.scanf,fscanf和sscanf 1.scanf 2.fscanf 3.sscanf 二.printf,fprintf和sprintf 1.printf 2.fprintf 3.sprintf 一.scanf,fscanf和sscanf 1.scanf 首先scanf我们的很熟悉,他就是从键盘上输入数据,准确的来说就是: 从标准输入(键盘)读取格式化的数据. int main() { int x = 0; scanf("%d", &x); return 0; }

  • Java语言----三种循环语句的区别介绍

    第一种:for循环 循环结构for语句的格式: for(初始化表达式;条件表达式;循环后的操作表达式) { 循环体;   } eg: class Dome_For2{ public static void main(String[] args) { //System.out.println("Hello World!"); //求1-10的偶数的和 int sum = 0; for (int i = 1;i<=10 ; i++ ) { if (i%2 ==0) { //判断语句

  • 详解易语言绝对取整和取整的区别

    易语言绝对取整和取整的区别,希望大家都能学懂. 非无私奉献,拒绝看经验不回复,学懂了记得按照下面做: 在底部点击相关按钮,给我投票和点赞. 有心得或者疑问,点击相关按钮反馈. 具体操作请看图. 1.易语言新建一个windows窗口 点击进入代码编辑区 2.我们输入绝对取整() 展开看看 发现只有一个参数 3.在输入取整() 展开看看 发现还是只有一个参数 4.看上去没有什么不同 我们举个例子 我们把这个参数都设为-7.8 5.我们在输入调试输出 用法如图所示 6.然后运行 通过结果发现 绝对取整

  • Go语言原子操作及互斥锁的区别

    目录 增或减 比较并交换(Compare And Swap) 载入与存储 交换 原子值 原子操作与互斥锁的区别 原子操作就是不可中断的操作,外界是看不到原子操作的中间状态,要么看到原子操作已经完成,要么看到原子操作已经结束.在某个值的原子操作执行的过程中,CPU绝对不会再去执行其他针对该值的操作,那么其他操作也是原子操作. Go语言中提供的原子操作都是非侵入式的,在标准库代码包sync/atomic中提供了相关的原子函数. 增或减 用于增或减的原子操作的函数名称都是以"Add"开头的,

  • 浅析C语言中堆和栈的区别

    在计算机领域,堆栈是一个不容忽视的概念,我们编写的C语言程序基本上都要用到.但对于很多的初学着来说,堆栈是一个很模糊的概念. 堆栈:一种数据结构.一个在程序运行时用于存放的地方,这可能是很多初学者的认识,因为我曾经就是这么想的和汇编语言中的堆栈一词混为一谈.我身边的一些编程的朋友以及在网上看帖遇到的朋友中有好多也说不清堆栈,所以我想有必要给大家分享一下我对堆栈的看法,有说的不对的地方请朋友们不吝赐教,这对于大家学习会有很大帮助. 一.前言: C语言程序经过编译连接后形成编译.连接后形成的二进制映

  • 基于C语言char与unsigned char的区别介绍

    在C中,默认的基础数据类型均为signed,现在我们以char为例,说明(signed) char与unsigned char之间的区别. 首先在内存中,char与unsigned char没有什么不同,都是一个字节,唯一的区别是,char的最高位为符号位,因此char能表示-127~127,unsigned char没有符号位,因此能表示0~255,这个好理解,8个bit,最多256种情况,因此无论如何都能表示256个数字. 在实际使用过程种有什么区别呢?主要是符号位,但是在普通的赋值,读写文

  • C语言 scanf输入多个数字只能以逗号分隔的操作

    C之scanf输入多个数字只能以逗号分隔,而不能用空格 TAB空白符分隔 #include <stdio.h> int main() { int num_max(int x,int y,int z); int a,b,c,max; scanf("%d,%d,%d",&a,&b,&c); max=num_max(a,b,c); printf("max=%d",max); return 0; } int num_max(int x,i

  • R语言-计算平均值不同函数的区别说明

    函数mean > mean(x) > num x1 x2 x3 10378050.50 89.45 81.18 80.45 此时对编号也求了平均值,不过往往我们只想对后面的数据求平均值.而且此时会出现一个警告.因为x是一个数据框,不是数值,所以不能直接用mean()函数. 函数colMeans() > colMeans(x) num x1 x2 x3 10378050.50 89.45 81.18 80.45 > colMeans(x)[c("x1","

  • C语言 scanf的工作原理详解

    目录 原理解释 解决办法 总结 原理解释 先来观察一段代码和运行结果: #include <iostream> using namespace std; int main() { int a; char c; scanf("%d", &a); printf("a = %d", a); scanf("%c", &c); printf("c = %c", c); } 该代码明明有两个 scanf ,但在

  • c语言++放在前面和后面的区别分析

    咱们先看第一个 i被赋值0,i++(后++)并没有输出1. 现在i被赋值0,++i,也就是前++后输出了1. i被赋值0,前++ 的话,就是自身先加1 就自身赋值变成1 ,后面的i的值都是1了. i被赋值0,先是后++,后++意思是 自己先被赋值,赋值完后等本语句结束后就自己加1了.第一个printf输出的是i开始被赋的值0, 第一个printf之后就是一个(:)分号,分号意思是这个语句的结束. 这条语句结束,这时候i就偷偷的自己加上1了,第2个printf输出的就是上一个语句处理后i的值了.

随机推荐