scanf 家族
从输入源读取字符并根据format字符串给出的格式代码对他进行转换。标准: [1] 7.19.6.2
函数成员
scanf, fscanf, sscanf,
wscanf, fwscanf, swscanf,
Tip
为了能让这些函数正常运行,指针参数的类型必须是对应格式代码的正确类型。 函数无法验证他们的指针参数是否是正确的类型,所以函数就假定他们是正确的。 如果指针参数的类型不正确,那么结果就会是垃圾,而且邻近的变量有可能在处理的过程中被改写 《C和指针》
format字符串
format字符串可能包含下列内容 [2]
-
空白字符 它们与输入中的零个或者多个空白字符匹配,在处理过程中间被忽略。( blank (‘ ‘); tab (‘t’); or newline (‘n’))
-
其他字符 当任何其他字符出现在格式字符串时,下一个输入字符必须与它匹配。如何匹配,该输入字符随后就被丢弃,如果不匹配,函数就不再读取直接返回。
格式类型 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
参考资料
[1] | http://www.open-std.org/jtc1/sc22/wg14/www/docs/C99RationaleV5.10.pdf |
[2] | http://msdn.microsoft.com/en-us/library/kwwtf9ch.aspx |
[3] | http://msdn.microsoft.com/en-us/library/xdb9w69d.aspx |
[4] | http://msdn.microsoft.com/en-us/library/6ttkkkhh(v=VS.80).aspx |