从输入源读取字符并根据format字符串给出的格式代码对他进行转换。 标准:7.19.6.2
函数成员
scanf, fscanf, sscanf,
wscanf, fwscanf, swscanf,
为了能让这些函数正常运行,指针参数的类型必须是对应格式代码的正确类型。 函数无法验证他们的指针参数是否是正确的类型,所以函数就假定他们是正确的。 如果指针参数的类型不正确,那么结果就会是垃圾,而且邻近的变量有可能在处理的过程中被改写 《C和指针》
format字符串
format字符串可能包含下列内容 (参考MSDN)
- 空白字符,它们与输入中的零个或者多个空白字符匹配,在处理过程中间被忽略。(
blank (' '); tab ('\t'); or newline ('\n')
) - 其他字符,当任何其他字符出现在格式字符串时,下一个输入字符必须与它匹配。如何匹配,该输入字符随后就被丢弃,如果不匹配,函数就不再读取直接返回。
- 格式代码 它们指定函数如何解释接下来的输入字符
%[*] [width] [{h | l | ll | L}]type
格式类型 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