当前位置: 首页 > java >正文

C语言之scanf/sprintf、fscanf/fprintf、sscanf/sprintf、snprintf

区别

    • scanf 与 printf
    • fscanf 与 fprintf
    • sscanf 与 sprintf
    • snprintf

scanf 与 printf

scanf函数和printf函数是应用于标准输入流和标准输出流的格式化输入输出语句。相信该对接口基本上都熟悉,所以此处详细贴出。

一、scanf 函数
scanf 函数的功能是从标准输入流读入格式化的数据

int scanf ( const char * format, ... );

二、printf 函数
printf 函数的功能是将格式化的数据打印到标准输出流上去

int printf ( const char * format, ... );

fscanf 与 fprintf

fscanf 函数和 fprintf 函数是应用于所有输入流和所有输出流的格式化输入输出语句。

一、fprintf 函数

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

fprintf函数的第一个参数是数据输出的目的地,除了第一个参数以外,其它参数都与printf函数的参数一样。
在这里插入图片描述

其实,fprintf函数的功能就是将“区域三”的数据,以“区域二”的格式输出到“区域一”。

例如我们要将一个结构体类型的变量信息输出到data.txt文件中去。

#include <stdio.h>
#include <string.h>
#include <errno.h>
struct S
{char name[20];char sex[5];int age;
};
int main()
{//打开文件FILE* pf = fopen("data.txt", "w");if (pf == NULL){printf("%s\n", strerror(errno));return 1;//文件打开失败,失败返回}//对文件进行格式化输出操作struct S s = { "zhangsan", "nan", 20 };fprintf(pf, "%s %s %d\n", s.name, s.sex, s.age);//关闭文件fclose(pf);pf = NULL;return 0;
}

二、fscanf 函数

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

fscanf函数的第一个参数是读取数据的位置,后面的参数我们也可以类比scanf函数的参数。
年少生而为人

其实,fscanf函数的功能就是将“区域一”的数据,以“区域二”的格式输入到“区域三”。

例如,我们要将刚才用fprintf函数输出到data.txt文件中的数据读取出来。

#include <stdio.h>
#include <string.h>
#include <errno.h>
struct S
{char name[20];char sex[5];int age;
};
int main()
{//打开文件FILE* pf = fopen("data.txt", "r");if (pf == NULL){printf("%s\n", strerror(errno));return 1;//文件打开失败,失败返回}//对文件进行格式化输入操作struct S tmp = { 0 };fscanf(pf, "%s %s %d", tmp.name, tmp.sex, &(tmp.age));printf("%s %s %d\n", tmp.name, tmp.sex, tmp.age);//将tmp中的内容打印出来,看是否读取成功//关闭文件fclose(pf);pf = NULL;return 0;
}

三、拓展
1、因为 fscanf 函数的功能是,从stream中读取数据,并根据参数格式将其存储到附加参数所指向的位置,所以我们只需将参数stream的位置传入stdin,使其在标准输入流中读取数据即可。

所以,下面两句代码的作用是等效的:

	scanf("%d", &input);fscanf(stdin, "%d", &input);

2、因为fprintf函数的功能是,将格式化数据写入stream中,所以我们只需将参数stream的位置传入stdout,使其将数据写入标准输出流即可。

所以,下面两句代码的作用是等效的:

	printf("%d\n", input);fprintf(stdout, "%d\n", input);

我们之前在介绍文件操作函数的时候就说过,当你要对某一个流进行输入或是输出操作的时候,首先要打开该流,当输入输出操作结束后要及时关闭该流。

既然printf函数和scanf函数也要对标准输入流和标准输出流进行操作,那么为什么在使用printf函数和scanf函数之前,并没有类似于打开文件流的fopen函数的使用,在使用完printf函数和scanf函数后又没有类似于关闭文件流的fclose函数的使用呢?
其实,当C程序运行起来的时候,会自动打开下面这三个流:

符号名称对应操作(显示)的位置
stdin标准输入流键盘
stdout标准输出流屏幕
stderr标准错误流屏幕

当程序运行结束后,这三个流又会自动关闭。所以,当我们需要对标准输入流或是标准输出流进行输入输出操作的时候,并不需要通过某些操作来打开这两个流,也不需要我们来关闭这两个流。

sscanf 与 sprintf

sscanf函数可以从字符串中读取格式化数据,sprintf函数可以将格式化数据写入字符串。

一、sscanf 函数

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

sscanf 函数从s读取数据并根据参数格式将其存储到附加参数给定的位置,就像使用scanf一样,但sscanf 函数是从s读取数据而不是标准输入(stdin)
在这里插入图片描述

也就是将从区域一中,以区域二的格式读取的数据,存储到区域三指向的空间。

例如,我们要将字符串 arr 里面的内容按照不同的格式读取出来。

#include <stdio.h>
int main()
{char arr[] = "2021 dragon";int year = 0;char s[10] = { 0 };sscanf(arr, "%d %s", &year, s);printf("%d\n", year);//2021printf("%s\n", s);//dragonreturn 0;
}

sscanf 函数功能与格式补充
该函数的具体功能有如下:

(1)根据格式从字符串中提取数据。如从字符串中取出整数、浮点数和字符串等。
(2)取指定长度的字符串;
(3)取到指定字符为止的字符串;
(4)取仅包含指定字符集的字符串;
(5)取到指定字符集为止的字符串。

该函数常用的可以支持格式字符%[]:

(1)-: 表示范围,如:%[1-9]表示只读取1-9这几个数字 %[a-z]表示只读取a-z小写字母,类似地 %[A-Z]只读取大写字母
(2)^: 表示不取,如:%[^1]表示读取除'1'以外的所有字符,%[^/]表示除/以外的所有字符
(3),: 范围可以用","相连接 如%[1-9,a-z]表示同时取1-9数字和a-z小写字母 
(4)原则:从第一个在指定范围内的数字开始读取,到第一个不在范围内的数字结束,%s 可以看成 %[] 的一个特例 %[^ ](注意^后面有一个空格!)

例如,解析网络的例子如下:

	const char *s = "http://www.baidu.com:1234";char protocol[32] = { 0 };char host[128] = { 0 };char port[8] = { 0 };sscanf(s,"%[^:]://%[^:]:%[1-9]",protocol,host,port);printf("protocol: %s\n",protocol);printf("host: %s\n",host);printf("port: %s\n",port);

二、sprintf函数

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

sprintf函数与printf函数功能相似,区别在于:printf函数是将数据格式化后直接打印在屏幕上,而sprintf函数是将数据格式化后存储在str所指向的字符串中
在这里插入图片描述

也就是将从区域三中,以区域二的格式读取的数据,存储到区域一指向的位置。

例如,将数据按照不同的格式写入字符串arr中。

#include <stdio.h>
int main()
{char arr[20] = { 0 };int year = 2021;char s[] = "dragon";sprintf(arr, "%d %s", year, s);printf("%s\n", arr);//2021 dragonreturn 0;
}

snprintf

一、snprintf 函数

int snprintf(char *str, int n, char * format [, argument, ...]);
注意:snprintf()并不是标C中规定的函数,但是在许多编译器中,厂商提供了其实现的版本。

该函数在 GCC 与 VC 编译器有差异:

1、GCC 编译器
在GCC中,该函数名称就snprintf(),其参数与返回值如下:

【参数】str为要写入的字符串;n为要写入的字符的最大数目,超过n会被截断;format为格式化字符串,与printf()函数相同;argument为变量。
【返回值】成功则返回参数str 字符串长度,失败则返回-1,错误原因存于errno 中。

在 GCC 中运行如下:

#include <stdio.h>
int main()
{char str[5];int ret = snprintf(str, 3, "%s", "abcdefg");printf("%d\n",ret);printf("%s",str);return 0;
}

输出:
7
ab

可以看出:GCC中的参数n表示向str中写入n个字符,包括’\0’字符,并且返回实际的字符串长度(不包含’\0’)。

1、VC 编译器
在VC中,该函数名称就 _snprintf(),其参数与返回值如下:

【参数】str为要写入的字符串;n为要写入的字符的最大数目,超过n会被截断;format为格式化字符串,与printf()函数相同;argument为变量。
【返回值】成功则返回参数str 字符串长度,失败则返回-1,错误原因存于errno 中。

在 VC 中运行如下:

#include <stdio.h>
int main()
{char str[5];int ret = _snprintf(str,3,"%s","abcdefg");printf("%d\n",ret);printf("%s",str);return 0;
}

输出:
-1
abc

可以看出:VC中的参数n表示会向str中写入n个字符,不包括’\0’字符,并且不会在字符串末尾添加’\0’符。当字符串长度超过参数n时,函数返回-1,以表示可能导致错误。

http://www.xdnf.cn/news/11307.html

相关文章:

  • Java 7的七大新功能
  • String index out of range: 100 报错详解
  • 虚拟机下载安装及其一些指令(VMware)
  • 守护进程
  • 对称加密与非对称加密
  • 一区即将要洗的DVD片子
  • 【安全】简单解析统一身份认证:介绍、原理和实现方法
  • 一文搞懂程序流程图详解
  • 使用webrtc-streamer查看实时监控
  • js常用四舍五入方法
  • caffe的用法
  • Mint UI - 饿了么出品的开源、轻量的移动端 UI 组件库
  • SecureCRT 64位安装与破解
  • 【并发编程】 --- CyclicBarrier原理简介 + 使用方法
  • C语言入门到精通,这一篇就够了(13万字笔记)
  • 【集合篇】Java集合概述
  • 主流压缩软件压缩率实测(图文详解,揭秘你不知道的)
  • little-loader 开源项目教程
  • 2、CSS 文本
  • canvas的drawImage方法参数详解
  • 【STK】手把手教你利用STK进行仿真-STK软件简介01STK基本模型
  • openlayers [四] 地图图层 Layers详解
  • MPM
  • ownCloud 的六大神奇用法
  • matlab plot 数组,matlab plot基本用法
  • Ubuntu Dockers安装与基本使用
  • 【数据库】数据库索引介绍和使用
  • 使用事件日志识别常见 Windows 错误
  • 今天给大家介绍一下什么是alkaline电池
  • 网络安全最新小白必学:msf基本使用_msf监听,2024年最新疯狂膜拜