scanf , fscanf , sscanf 或 wsscanf 子例程
用途
转换格式化输入。
库
标准 C 库 (libc.a)
或 (libc128.a)
语法
#include <stdio.h>
const char * String, *Format;
描述
斯坎夫, 弗斯坎夫, 斯坎夫和 弗斯坎夫 子例程读取字符数据,根据格式对其进行解释,并将转换后的结果存储到指定的内存位置。 如果子例程接收到的格式参数不足,那么结果不可靠。 如果在参数保留时格式已耗尽,那么子例程将对多余的参数进行求值,否则将忽略这些参数。
这些子例程从以下源读取其输入:
| 项 | 描述 |
|---|---|
| scanf | 从标准输入读取 (斯丁)。 |
| 弗斯坎夫 | 从 流 参数. 中读取 |
| 斯坎夫 | 从由 字符串 参数指定的字符串中读取。 |
| 弗斯坎夫 | 从 世界基督教 参数指定的宽字符字符串中读取。 |
斯坎夫, 弗斯坎夫, 斯坎夫和 弗斯坎夫 子例程可以在输入字符串中检测依赖于语言的基字符 (在程序的语言环境 (LC_NUMERIC) 中定义)。 在 C 语言环境中,或者在未定义 Radix 字符的语言环境中,缺省 Radix 字符是一个句号。 :NONE.
参数
| 项 | 描述 |
|---|---|
| 世界基督教 | 指定要读入的宽字符字符串。 |
| 流 | 指定输入流。 |
| String | 指定要读取的输入。 |
| POINTER | 指定所解释数据的存储位置。 |
| 格式 | 包含用于解释输入的转换规范。 如果 格式 参数没有足够的参数,那么结果将不可靠。 如果在参数保留时 格式 参数已耗尽,那么将始终对多余的参数进行求值,否则将忽略这些参数。 格式 参数可以包含以下内容:
|
| 项 | 描述 |
|---|---|
| 格式 (续) |
|
除非您使用 * (星号) 指定分配禁止,否则转换结果将放置在 指针 参数指定的内存位置中。 分配禁止提供了一种描述要跳过的输入字段的方法。 输入字段是由非空格字符组成的字符串。 它延伸到下一个不适当的字符,或者直到字段宽度 (如果指定的话) 耗尽为止。
转换代码会指示如何解释输入字段。 相应的 指针 参数必须是受限类型。 请不要对禁止字段指定 指针 参数。 您可以使用以下转换代码:
- %
- 接受此时的单个% (百分号) 输入; 不执行任何分配或转换。 完整的转换规范应该是 %% (两个百分号)。
- 天
- 接受与 基 参数值为 10 的 斯特托尔 子例程的主题序列所期望的格式相同的可选带符号的十进制整数。 如果未指定任何大小修饰符,那么 指针 参数应该是指向整数的指针。
- i
- 接受与 基 参数值为 0 的 斯特托尔 子例程的主题序列所期望的格式相同的可选带符号的整数。 如果未指定任何大小修饰符,那么 指针 参数应该是指向整数的指针。
- u
- 接受与 基 参数值为 10 的 斯特图尔 子例程的主题序列所期望的格式相同的可选带符号的十进制整数。 如果未指定大小修饰符,那么 指针 参数应该是一个指向无符号整数的指针。
- o
- 接受与 基 参数的值为 8 的 斯特图尔 子例程的主题序列所期望的格式相同的可选带符号八进制整数。 如果未指定大小修饰符,那么 指针 参数应该是一个指向无符号整数的指针。
- X
- 接受与 基 参数值为 16 的 斯特图尔 子例程的主题序列所期望的格式相同的可选带符号的十六进制整数。 如果未指定任何大小修饰符,那么 指针 参数应该是指向整数的指针。
- E, F或 G
- 接受具有与 斯特托德 子例程的主题序列所期望的格式相同的格式的可选带符号浮点数。 下一个字段将相应地转换并通过相应的参数存储; 如果未指定大小修饰符,那么此参数应该是指向浮点值的指针。 浮点数的输入格式是一个由数字组成的字符串,具有一些可选特征:
- 它可以是签名值。
- 它可以是指数值,包含后跟指数字段的十进制有理数,该指数字段由 E 或 E 后跟一个 (可选带符号) 整数组成。
- 它可以是INF、NaNQ 或 NaNS 中的一个特殊值。 该值将分别转换为无穷大、静NaN 或信号NaN IEEE-754值。
- p
- 匹配一个无符号的十六进制整数,与 普林特夫 子例程的 %p 转换相同。 相应的参数是指向空指针的指针。 如果输入项是在同一程序执行期间先前转换的值,那么生成的指针将与该值进行比较; 否则, %p 转换的结果将不可预测。
- n
- 不使用任何输入。 对应的参数是一个指向整数的指针, 斯坎夫, 弗斯坎夫, 斯坎夫或 弗斯坎夫 子例程将从输入流中读取的字符数 (包括宽字符) 写入该整数。 在此函数完成时返回的分配计数不会递增。
- 请
- 接受一个非空格字符序列 (斯坎夫, 弗斯坎夫和 斯坎夫 子例程)。 弗斯坎夫 子例程接受非空格宽字符代码的序列; 此序列将以与 韦克斯托姆斯 子例程相同的方式转换为字符序列。 指针 参数应该是一个指向 字符,带符号 字符或无符号 字符 数组的初始字节的指针,该数组应该足够大以容纳序列和终止空字符代码 (自动添加)。
- 六
- 接受一个非空格字符序列 (斯坎夫, 弗斯坎夫和 斯坎夫 子例程)。 此序列将以与 姆布斯托奇 子例程相同的方式转换为宽字符码序列。 弗斯坎夫 子例程接受非空格宽字符代码的序列。 指针 参数应该是一个指向数组的初始宽字符代码的指针,该数组的大小足以接受序列和终止空宽字符代码,该代码将自动添加。 如果指定了字段宽度,那么它表示要接受的最大字符数。
- c
- 接受由字段宽度 (斯坎夫, 弗斯坎夫 和 斯坎夫 子例程) 指定的数字的字节序列; 如果未指定字段宽度 1 那么缺省值为 1。 弗斯坎夫 子例程接受由字段宽度指定的数字组成的宽字符代码序列; 如果未指定字段 1 ,那么缺省值为 1。 以与 韦克斯托姆斯 子例程相同的方式将该序列转换为字符序列。 指针 参数应该是一个指向数组的初始字节的指针,该数组的大小足以容纳序列; 不会添加任何空字节。 不会发生正常跳过空格的情况。
- C
- 接受由字段宽度 (斯坎夫, 弗斯坎夫和 斯坎夫 子例程) 指定的数字的字符序列; 如果未指定字段宽度,那么 1 值为 1。 以与 姆布斯托奇 子例程相同的方式将该序列转换为宽字符代码序列。 弗斯坎夫 子例程接受由字段宽度指定的数字组成的宽字符代码序列; 如果未指定字段 1 ,那么缺省值为 1。 指针 参数应该是一个指针,该指针指向足够大的数组的初始宽字符代码以容纳序列; 不会添加任何空宽字符代码。
- [斯堪的纳维亚]
- 接受由 斯堪的纳维亚 变量 (斯坎夫, 弗斯坎夫和 斯坎夫 子例程) 指定的一组期望字节中的非空字节序列。 弗斯坎夫 子例程接受 斯堪的纳维亚 变量指定的一组期望的宽字符代码中的宽字符代码的非空序列。 以与 韦克斯托姆斯 子例程相同的方式将该序列转换为字符序列。 指针 参数应该是一个指向 字符, 已签署 字符或 无符号 字符 数组的初始字符的指针,该数组足够大以容纳序列和终止空字节 (自动添加)。 在 斯坎夫, 弗斯坎夫和 斯坎夫 子例程中,转换规范包括由 格式 参数指定的字符串中的所有后续字节,直到并包括] (右括号)。 除非 [(左括号) 后面的字节是 ^ (抑扬符) ,否则方括号之间的字节将包含 斯堪的纳维亚 变量。 在此情况下, 斯堪的纳维亚 变量包含在 ^ (抑扬符) 和] (右方括号) 之间的扫描列表中未出现的所有字节。 在 弗斯坎夫 子例程中,首先以与 姆布托克 子例程相同的方式将方括号之间的字符转换为宽字符代码。 然后,这些宽字符代码将按上述方式使用,以代替 scanlist 中的字节。 如果转换指定项以 [] 或 [^] 开头,那么右括号将包含在扫描列表中,下一个右括号是结束转换指定项的匹配右括号。 您还可以:
- 通过构造 第一次-最后 来表示字符范围 因此,可以将 [0123456789] 表示为 [0-9]。 第一次 参数必须在词法上小于或等于 最后 参数,否则-(短划线) 表示它本身。 -当它是 斯堪的纳维亚 变量中的第一个或最后一个字符时,也表示它自己。
- 如果] (右括号) 是 斯堪的纳维亚的第一个字符,请将它作为 斯堪的纳维亚 变量的元素包含在内。 在此情况下,不会将其解释为用于关闭 斯堪的纳维亚 变量的括号。 如果 斯堪的纳维亚 变量是互斥 斯堪的纳维亚 变量,那么在] 前面加上 ^ (抑扬符) ,以使] 成为 斯堪的纳维亚的元素。 相应的 指针 参数应该指向一个足够大的字符数组,以容纳数据字段并且以空字符 (\0) 结尾。 将自动添加 \0。
斯坎夫 转换在文件结束 (EOF 字符) ,控制字符串结束或输入字符与控制字符串发生冲突时结束。 如果它以输入字符冲突结束,那么不会从输入流中读取冲突的字符。
除非在控制字符串中存在匹配项,否则不会读取尾部空格 (包括换行符)。
字面值匹配和禁止赋值的成功与否无法直接确定。
斯坎夫 子例程的本地语言支持 (NLS) 扩展可以处理格式字符串,该格式字符串使系统能够按变量顺序处理自变量列表的元素。 正常转换字符% 将替换为%N$,其中 N 是十进制数。 然后将转换应用于指定的自变量 (即,第 N个自变量) ,而不是应用于下一个未使用的自变量。
第一次成功运行 菲格茨, 费斯, 弗朗, 盖茨, Getchar, 获取, 斯坎夫或 弗斯坎夫 子例程时,使用了返回先前调用 难忘 (ungetc 或 ungetwc 子例程) 子例程时未提供的数据的流来标记st_atime用于更新的字段。
返回值
这些子例程返回成功匹配和分配的输入项的数目。 如果输入字符与控制字符串之间存在早期冲突,那么此数字可以为 0。 如果输入在第一次冲突或转换之前结束,那么仅返回 EOF。 如果发生读错误,那么将设置流的错误指示符,返回 EOF ,并设置 错误号 全局变量以指示该错误。
错误代码
如果由 流, 字符串或 世界基督教 参数指定的文件未缓冲,或者需要将数据读取到文件的缓冲区中,并且以下一个或多个条件成立,那么 斯坎夫, 弗斯坎夫, 斯坎夫和 弗斯坎夫 子例程失败:
| 项 | 描述 |
|---|---|
| EAGAIN | 为 流, 字符串或 世界基督教 参数指定的文件底层的文件描述符设置了 O_NONBLOCK 标志,并且该进程将在 斯坎夫, 弗斯坎夫, 斯坎夫 或 弗斯坎夫 操作中延迟。 |
| EBADF | 流, 字符串或 世界基督教 参数指定的文件所依据的文件描述符不是打开的有效文件描述符,无法进行读取。 |
| EINTR | 由于接收到信号而终止了读操作,并且未传输任何数据或未报告部分传输。 |
| 项 | 描述 |
|---|---|
| EIO | 该进程是尝试从其控制终端执行读操作的后台进程组的成员,并且该进程正在忽略或阻止 SIGTTIN 信号,或者该进程组没有父进程。 |
| EINVAL | 子例程接收到 格式 参数的参数不足。 |
| EILSEQ | 检测到无效的字符序列,或者宽字符代码与有效的字符不对应。 |
| ENOMEM | 没有足够的存储空间可用。 |