Back to Top

scanf 家族

从输入源读取字符并根据format字符串给出的格式代码对他进行转换。 标准:7.19.6.2

函数成员

scanf, fscanf, sscanf, 
wscanf, fwscanf, swscanf, 

为了能让这些函数正常运行,指针参数的类型必须是对应格式代码的正确类型。 函数无法验证他们的指针参数是否是正确的类型,所以函数就假定他们是正确的。 如果指针参数的类型不正确,那么结果就会是垃圾,而且邻近的变量有可能在处理的过程中被改写 《C和指针》

format字符串

format字符串可能包含下列内容 (参考MSDN)

  1. 空白字符,它们与输入中的零个或者多个空白字符匹配,在处理过程中间被忽略。(blank (' '); tab ('\t'); or newline ('\n'))
  2. 其他字符,当任何其他字符出现在格式字符串时,下一个输入字符必须与它匹配。如何匹配,该输入字符随后就被丢弃,如果不匹配,函数就不再读取直接返回。
  3. 格式代码 它们指定函数如何解释接下来的输入字符 %[*] [width] [{h | l | ll | L}]type
    1. 一个可选的星号[*] 将使转换后的值被丢弃而不是进行存储。可以用于跳过不需要输入的字符。
    2. 一个可选的宽度[width]限制将被读取用于转化的输入的字符个数,如果未给出宽度,函数就连续读入字符直到预见输入中的下一个空白字符
    3. 一个可选的限定符[{h l ll L}] 参考MSDN
    4. 格式类型type 参考MSDN

格式类型 type

Character Type Output format
c char* 读取和存储单个字符.前导的空白字符并不跳过.如果给出宽度,就读取和存储这个数目的字符,字符后面不会添加\0.参数必须指向一个足够大的字符数组
d,i int* 一个可选的有符号整数转换.d把输入解释为十进制;i根据它的第1个字符决定值的基数,十进制,八进制,十六进制
u,o,x unsigned* 一个可选的有符号整数转换.但它按照无符号数存储. 十进制:u; 八进制:o; 十六进制:x,X, x和X同义.
e,f,g float* 期待一个浮点值,它的形式必须像一个浮点型字面值常量,但小数点并非必须.e和E g和G同义
s char* 读取一串非空白字符.参数必须指向一个足够大的字符数组,当发现空白时输入就停止,字符串结尾会自动加上\0
[xxx] char* 根据给组合的字符从输入中读取一串字符.参数必须指向一个足够大的数组.当遇到第一个不在给定组合中出现的字符时,输入就停止.字符串结尾会自动加\0.%[abc]代表含有a,b,c,%[^abc]代表不含有a,b,c
P void* 将printf的%P输出的字符串转化为数据,具体转化方式由编译器决定
n int* 到目前为止通过函数调用从输入读取的字符数被返回。%n转化的字符并不计算在函数的返回值之内。它本身并不消耗任何输入
%   这个代码与输入中的一个%相匹配,这个%符号将被丢弃

限定符 [{h | l | ll | L}]

仅整理了VS和GCC中共用部分

To specify Use prefix With type specifier
double l e, E, f, g, or G
long double  L e, E, f, g, or G
long int l d, i, o, x, or X
long unsigned int l u
long long ll d, i, o, x, or X
short int h d, i, o, x, or X
short unsigned int h u
To specify Use prefix With type specifier
Single-byte character with scanf h c or C
Single-byte character with wscanf h c or C
Wide character with scanf l c or C
Wide character with wscanf l c, or C
Single-byte – character string with scanf h s or S
Single-byte – character string with wscanf h s or S
Wide-character string with scanf l s or S
Wide-character string with wscanf l s or S

参考资料

ISO_IEC_9899 MSDN_FormatSpecificationFields MSDN_SizePrefix MSDN_TypeFieldCharacters