scanf , fscanf , sscanf 或 wsscanf 子例程

用途

转换格式化输入。

标准 C 库 (libc.a)

或 (libc128.a)

语法

#include <stdio.h>
int scanf ( Format [,  Pointer... ])
const char *Format;
int fscanf (Stream, Format [, Pointer... ])
FILE * Stream;
const char *Format;
int sscanf (String, Format [, Pointer... ])
const char * String, *Format;
int wsscanf (wcsFormat [, Pointer, ... ])
const wchar_t *  wcs
const char *Format;

描述

斯坎夫弗斯坎夫 斯坎夫弗斯坎夫 子例程读取字符数据,根据格式对其进行解释,并将转换后的结果存储到指定的内存位置。 如果子例程接收到的格式参数不足,那么结果不可靠。 如果在参数保留时格式已耗尽,那么子例程将对多余的参数进行求值,否则将忽略这些参数。

这些子例程从以下源读取其输入:

描述
scanf 从标准输入读取 (斯丁)。
弗斯坎夫 参数. 中读取
斯坎夫 从由 字符串 参数指定的字符串中读取。
弗斯坎夫 世界基督教 参数指定的宽字符字符串中读取。

斯坎夫弗斯坎夫斯坎夫弗斯坎夫 子例程可以在输入字符串中检测依赖于语言的基字符 (在程序的语言环境 (LC_NUMERIC) 中定义)。 在 C 语言环境中,或者在未定义 Radix 字符的语言环境中,缺省 Radix 字符是一个句号。 :NONE.

参数

描述
世界基督教 指定要读入的宽字符字符串。
指定输入流。
String 指定要读取的输入。
POINTER 指定所解释数据的存储位置。
格式 包含用于解释输入的转换规范。 如果 格式 参数没有足够的参数,那么结果将不可靠。 如果在参数保留时 格式 参数已耗尽,那么将始终对多余的参数进行求值,否则将忽略这些参数。

格式 参数可以包含以下内容:

  • 空格字符 (空白,制表符,换行符,垂直制表符或换页符) ,除以下两种情况外,最多可读取下一个非空格字符的输入。 除非在控制字符串中存在匹配项,否则不会读取尾部空格 (包括换行符)。
  • 除% (百分号) 以外的任何字符,必须与输入流的下一个字符匹配。
  • 用于指导下一个输入字段的转换的转换规范。 转换规范由以下内容组成:
    • % (百分号) 或字符顺序为%N$。
      注意:
      %N$字符序列是一个 X/Open 编号参数说明符。 以下是使用%N% 说明符的准则:
      • N in%N$的值必须是不带前导 0 的十进制数字,并且必须在 1 到 NL_ARGMAX 值的范围内 1 含)。 请参阅 limits.h 文件,以获取有关 NL_ARGMAX 值的更多信息。 使用前导 0 (八进制数字) 或更大的 N 值可能会产生不可预测的结果。
      • 在格式字符串中混合编号和未编号的参数规范可能会产生不可预测的结果。 唯一的例外是 %% (两个百分号) 和% * (百分号,星号) ,可以与%N$表单混合使用。
      • 多次从格式字符串引用参数列表中的编号参数可能会产生不可预测的结果。
    • 可选的赋值-禁止字符 * (星号)。
    • 可选十进制整数,用于指定最大字段宽度。
    • 一个可选字符,用于设置某些标志的接收变量的大小。 使用以下可选字符:
      L
      如果在 DN 转换代码之前,那么为长整数而不是整数; 如果在 OX 转换代码之前,那么为无符号长整数而不是无符号整数; 如果在 EFG 转换代码之前,那么为双精度值而不是浮点值。
      LL
      在前置 DN 转换代码时,为长长整数而不是整数; 在前置 OX 转换代码时,为无符号长长整数而不是无符号整数。
      L
      EF G 转换代码之前的长整型双精度值而不是浮点型值; 在 DN 转换代码之前的长整型整数而不是整数; 在 OX 转换代码之前的无符号长整型值而不是无符号整数。
      h
      DN 转换代码之前,这是一个短整数而不是整数; 在 OX 转换代码之前,是一个无符号的短整数 (半整数) 而不是一个无符号的整数。
      H
      EEFFGG 转换代码之前的值为 _Decimal32 而不是浮点值。
      EEFFGG 转换代码之前的值为 _Decimal64 而不是浮点值。
      DD
      EEFFGG 转换代码之前的值为 _Decimal128 而不是浮点值。
描述
格式 (续)
  • 一个可选字符,用于设置向量数据类型的接收变量的大小。 使用以下可选字符:
    v
    vector float (四个 4 字节的浮点组件) (在 eEfgGaA 转换代码之前); vector signed char (十六个 1 字节的字符组件) (在 cd之前) , 或 i 转换代码; vector unsigned char (在 ouxX 转换代码之前)。
    vl 或 lv
    vector signed integer (四个 4 字节整数组件) (在 di 转换代码之前); vector unsigned integer (在 ouxX 转换代码之前)。
    vh 或 hv
    vector signed short (8 个 2 字节的整数组件) (在 di 转换代码之前); vector unsigned short (在 ouxX 转换代码之前)。
    对于前面的任何一个说明符,可以在紧接向量大小说明符之前指定可选的分隔符。 如果未指定分隔符,那么除非转换为 c(在这种情况下,缺省分隔符为空) ,否则缺省分隔符为空格。 受支持的可选分隔符集为 , (逗号) , ; (分号) , : (冒号) 和 _ (下划线)。
  • 这是一个转换代码,用于指定要应用的转换类型。

    转换规范采用以下格式:

    %[*][width][size]convcode

除非您使用 * (星号) 指定分配禁止,否则转换结果将放置在 指针 参数指定的内存位置中。 分配禁止提供了一种描述要跳过的输入字段的方法。 输入字段是由非空格字符组成的字符串。 它延伸到下一个不适当的字符,或者直到字段宽度 (如果指定的话) 耗尽为止。

转换代码会指示如何解释输入字段。 相应的 指针 参数必须是受限类型。 请不要对禁止字段指定 指针 参数。 您可以使用以下转换代码:

%
接受此时的单个% (百分号) 输入; 不执行任何分配或转换。 完整的转换规范应该是 %% (两个百分号)。
接受与 参数值为 10斯特托尔 子例程的主题序列所期望的格式相同的可选带符号的十进制整数。 如果未指定任何大小修饰符,那么 指针 参数应该是指向整数的指针。
i
接受与 参数值为 0斯特托尔 子例程的主题序列所期望的格式相同的可选带符号的整数。 如果未指定任何大小修饰符,那么 指针 参数应该是指向整数的指针。
u
接受与 参数值为 10斯特图尔 子例程的主题序列所期望的格式相同的可选带符号的十进制整数。 如果未指定大小修饰符,那么 指针 参数应该是一个指向无符号整数的指针。
o
接受与 参数的值为 8斯特图尔 子例程的主题序列所期望的格式相同的可选带符号八进制整数。 如果未指定大小修饰符,那么 指针 参数应该是一个指向无符号整数的指针。
X
接受与 参数值为 16斯特图尔 子例程的主题序列所期望的格式相同的可选带符号的十六进制整数。 如果未指定任何大小修饰符,那么 指针 参数应该是指向整数的指针。
E F G
接受具有与 斯特托德 子例程的主题序列所期望的格式相同的格式的可选带符号浮点数。 下一个字段将相应地转换并通过相应的参数存储; 如果未指定大小修饰符,那么此参数应该是指向浮点值的指针。 浮点数的输入格式是一个由数字组成的字符串,具有一些可选特征:
  • 它可以是签名值。
  • 它可以是指数值,包含后跟指数字段的十进制有理数,该指数字段由 EE 后跟一个 (可选带符号) 整数组成。
  • 它可以是INFNaNQ 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 由于接收到信号而终止了读操作,并且未传输任何数据或未报告部分传输。
注: 根据应用程序绑定到的库例程,此子例程可能会返回 EINTR。 请参阅有关 SA_RESTART信号 (sigaction , sigvec 或 signal 子例程) 子例程。
描述
EIO 该进程是尝试从其控制终端执行读操作的后台进程组的成员,并且该进程正在忽略或阻止 SIGTTIN 信号,或者该进程组没有父进程。
EINVAL 子例程接收到 格式 参数的参数不足。
EILSEQ 检测到无效的字符序列,或者宽字符代码与有效的字符不对应。
ENOMEM 没有足够的存储空间可用。