scanf 家族

Table Of Contents

Previous topic

printf 家族

Next topic

Google C++ 风格指南 - 中文版

scanf 家族

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

函数成员

scanf, fscanf, sscanf,

wscanf, fwscanf, swscanf,

Tip

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

format字符串

format字符串可能包含下列内容 [2]

  1. 空白字符 它们与输入中的零个或者多个空白字符匹配,在处理过程中间被忽略。( blank (‘ ‘); tab (‘t’); or newline (‘n’))

  2. 其他字符 当任何其他字符出现在格式字符串时,下一个输入字符必须与它匹配。如何匹配,该输入字符随后就被丢弃,如果不匹配,函数就不再读取直接返回。

  3. 格式代码 它们指定函数如何解释接下来的输入字符  %[*] [width] [{h | l | ll | L}]type
    1. 一个可选的星号[*] 将使转换后的值被丢弃而不是进行存储。可以用于跳过不需要输入的字符。
    2. 一个可选的宽度[width] 限制将被读取用于转化的输入的字符个数,如果未给出宽度,函数就连续读入字符直到预见输入中的下一个空白字符
    3. 一个可选的限定符[{h | l | ll | L}] [3]
    4. 格式类型type [4]

格式类型 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



http://www.cppexample.com/standard/printf.html





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值