C Library User 手册(6)

240 篇文章 11 订阅

6 Formatted Input

有几个库函数帮助你将数据值从一般人可读的文本序列转换成编码的内部表示。你提供一个格式字符串作为这些函数的格式参数的值,因此称为格式化输入。这些函数分为两类。
字节扫描函数(在<stdio.h>中声明)将char类型的序列转换为内部表示,并帮助你扫描你读到的这种序列:fscanf, scanf, sscanf。对于这些函数,格式字符串是一个多字节的字符串,以初始移位状态开始和结束。
宽扫描函数(在<wchar.h>中声明,因此与修正案1一起添加)将wchar_t类型的序列转换为内部表示,并帮助你扫描你读到的这类序列:fwscanf,wscanf,。对于这些函数,一个格式字符串是一个宽字符字符串。在下面的描述中,来自格式串或流的宽字符wc与特定的(字节)字符c进行比较,就像通过评估表达式wctob(wc) == c一样。

6.1 Scan formats

对于扫描功能来说,格式字符串的一般语法与打印功能相同:零个或多个转换规范,中间穿插着文字和空白。然而,对于扫描函数来说,一个转换规范是下面描述的扫描转换规范之一。
一个扫描函数从头到尾扫描一次格式字符串,以确定要执行哪些转换。每个扫描函数都接受不同数量的参数,可以直接接受,也可以在一个类型为va_list的参数控制下接受。格式字符串中的一些扫描转换规范使用列表中的下一个参数。一个扫描函数使用每个连续的参数不超过一次。后面的参数可以不使用。
在下面的描述中,整数转换和浮点转换与打印函数相同。

6.2 Scan functions

对于扫描功能,格式字符串中的文字必须与输入文本中要扫描的下一个字符相匹配。格式字符串中的空白必须与输入文本中下一个零或多个空白字符的最长序列相匹配。除了扫描转换指定符%n(不消耗输入),每个扫描转换指定符都确定了一个模式,输入中的一个或多个下一个字符必须匹配。除了扫描转换指定符c、n和[外,每个匹配开始时都要跳过输入中的任何空白字符。
一个扫描函数在以下情况下返回:
■它在格式字符串中达到了终止的空值
■无法获得额外的输入字符来扫描(输入失败)。
■转换失败(匹配失败)。
如果在任何转换之前发生输入失败,扫描函数返回EOF。否则它将返回所存储的转换值的数量。如果一个或多个字符组成了一个有效的前缀,但转换失败,在扫描函数返回之前,有效的前缀会被消耗掉。因此。
scanf("%i", &i) 从字段0XZ消耗0X scanf("%f", &f) 从字段3.2EZ消耗3.2E
一个扫描转换规范通常将匹配的输入字符转换为相应的编码值。下一个参数值必须是一个对象的地址。该转换对编码表示进行转换(如有必要)并将其值存储在对象中。一个扫描转换规范具有图中所示的格式。
在这里插入图片描述
在C语言技术报告TR18037中增加了对定点转换的支持。这些与飞思卡尔信号处理引擎辅助处理单元的扩展密切相关。作为一个符合要求的扩展,该实现还包括对飞思卡尔AltiVec架构所支持的向量的转换。
在格式字符串中的百分比字符(%)后面,你可以写一个星号()来表示转换不应该把转换后的值存储在一个对象中。
对于AltiVec矢量转换,你可以在星号前面或后面加一个可选的分隔符,即逗号、分号、等号或下划线。转换发生在矢量的每个元素上,并在每对元素之间匹配一个分隔符序列。如果你指定一个分隔符,分隔符序列是可选的白色空间,以分隔符结束。如果你没有指定分隔符,默认的分隔符序列是。
■对于c转换指定符,没有。
■对于所有其他的转换规范,可选的白色空间,以空格结束。
在任何
和/或分隔符之后,你可以写一个非零字段宽度,指定转换时要匹配的最大输入字符数(不计入模式可以首先跳过的任何白色空间)。

6.3 Scan conversion specifiers

在任何字段宽度之后,你必须写一个单字符的扫描转换指定符,可以是一个单字符代码,也可以是一个扫描集,前面可能还有一个单字符或双字符的限定符。每个组合都决定了下一个参数所需的类型(如果有的话),以及扫描函数如何解释文本序列并将其转换为一个编码的值。整数和浮点的转换也决定了文本表示法的基数。(基数是函数strtol和strtoul的基数参数。) 下表列出了所有定义的组合和它们的属性。
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
扫描转换指定器(或扫描集)决定了本表中没有总结的任何行为。在下面的描述中,每个扫描转换指定器后面都有例子。在每个例子中,函数 sscanf 匹配了粗体字符。
你写%c来存储匹配的输入字符在一个数组对象中。如果你没有指定字段宽度w,那么w的值为1。匹配时不跳过前面的白色空间。任何w字符的序列都与转换模式相匹配。

sscanf("129E-2", "%c", &c) stores '1' sscanf("129E-2", "%2c", &c[0]) stores '1', '2'

对于一个宽流,转换的发生就像重复调用wcrtomb一样,从初始转换状态开始。

swscanf(L"129E-2", L"%c", &c) stores '1'

你写%lc来存储匹配的输入字符在一个数组对象中,其元素类型为wchar_t。如果你没有指定字段宽度w,那么w的值为1。匹配时不跳过前面的白色空间。任何w字符的序列都与转换模式相匹配。对于一个字节流,转换的发生就像重复调用mbrtowc一样,从初始转换状态开始。

sscanf("129E-2", "%lc", &c) sscanf("129E-2", "%2lc", &c) swscanf(L"129E-2", L"%lc", &c)
stores L'1'
stores L'1', L'2'
stores L'1'

你写%d、%i、%o、%u、%x或%X来转换匹配的输入字符为有符号的整数,并将结果存储在一个整数对象中。

sscanf("129E-2", "%o%d%x", &i, &j, &k) stores 10, 9, 14

你写%a, %A, %e, %E, %f, %F, %g, 或%G来转换匹配的输入字符为
带符号的分数,可选指数,并将结果存储在一个浮点对象中。
sscanf(“129E-2”, “%e”, &f) 存储1.29
你写%n,在一个整数对象中存储匹配的字符数(到格式的这一点)。匹配时不跳过前面的白色空间,也不匹配任何输入字符。
sscanf(“129E-2”, “12%n”, &i) 存储 2
你写%p来转换匹配的输入字符作为指向void的指针的外部表示,并将结果存储在指向void的指针类型的对象中。输入的字符必须与%p打印转换规范所产生的形式相匹配。
sscanf(“129E-2”, “%p”, &p)存储,例如:0x129E
你写%s来存储匹配的输入字符在一个数组对象中,后面是一个结束的空字符。如果你没有指定字段宽度w,那么w就有一个大值。任何由多达w个非白空间字符组成的序列都与转换模式相匹配。
sscanf(“129E-2”, “%s”, &s[0]) 存储 “129E-2”
对于一个宽数据流,转换的发生就像从初始转换状态开始反复调用wcrtomb一样。
swscanf(L “129E-2”, L"%s", &s[0]) 存储 “129E-2”
你写%ls是为了将匹配的输入字符存储在一个数组对象中,其元素类型为wchar_t,后面是一个结束的空宽字符。如果你没有指定字段宽度w,那么w就有一个大值。任何由多达w个非白空间字符组成的序列都与转换模式相匹配。对于一个字节流,转换的发生就像重复调用mbrtowc一样,从初始转换状态开始。
sscanf(“129E-2”, “%ls”, &s[0]) 存储 L “129E-2” swscanf(L “129E-2”, L"%ls", &s[0]) 存储 L “129E-2”
你写%[来存储匹配的输入字符在一个数组对象中,后面是一个结束的空字符。如果你没有指定字段宽度w,那么w就有一个大值。匹配时不跳过前面的白色空间。在接下来的扫描集中,最多有w个字符的序列与转换模式相匹配。为了完成扫描集,你要在转换规范中的左括号([)后面加上一串零或更多的匹配字符,以右括号(])结束。
如果你不在[]后面写一个圆点(),那么每个输入字符必须与其中一个匹配字符相匹配。如果您在[或[]后面紧接着写了一个],那么]就是第一个匹配字符,而不是终止的]。如果你把减号(-)写成第一个或最后一个匹配字符以外的字符,实现可以赋予它特殊含义。它通常表示一个字符范围,与紧接着的字符一起,如0-9表示所有的数字)。你不能指定一个空的匹配字符。
sscanf(“129E-2”, “%[54321]”, &s[0]) 存储 “12”
对于一个宽数据流,转换的发生就像重复调用wcrtomb一样,从初始转换状态开始。
初始转换状态。
swscanf(L “129E-2”, L"%[54321]", &s[0]) 存储 “12”
你写%l[将匹配的输入字符存储在一个数组对象中,元素类型为wchar_t,后面是一个结束的空宽字符。如果你没有指定字段宽度w,那么w就有一个大值。匹配时不跳过前面的白色空间。在后面的扫描集中,一连串的上拖字符与转换模式相匹配。
对于一个字节流,转换的发生就像重复调用mbrtowc一样,从初始转换状态开始。
sscanf(“129E-2”, “%l[54321]”, &s[0]) 存储 L “12” swscanf(L “129E-2”, L"%l[54321]", &s[0]) 存储 L “12”
你写%%来匹配百分数字符(%)。sscanf("% 0XA", “%% %i”, &i) 存储10
使用www.DeepL.com/Translator翻译(免费版)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值