scanf格式详解
c语言中,你可能会遇到这样的scanf
输入形式:scanf("%[^\n]%*c",s);
,从而摸不着头脑——这是个什么意思呢?
我们慢慢分析,已知scanf
的格式说明符遵循以下原型[1]:
%[*][width][length]specifier
%
后三个[]
中的内容是可选的,可以有,也可以没有。分别表示:
sub-specifier | description |
---|---|
* | An optional starting asterisk indicates that the data is to be read from the stream but ignored (i.e. it is not stored in the location pointed by an argument). |
width | Specifies the maximum number of characters to be read in the current reading operation (optional). |
length | One of hh , h , l , ll , j , z , t , L (optional). This alters the expected type of the storage pointed by the corresponding argument (see below). |
其中specifier
内容有以下形式:
specifier | Description | Characters extracted |
---|---|---|
i | Integer | Any number of digits, optionally preceded by a sign (+ or - ). Decimal digits assumed by default (0-9 ), but a 0 prefix introduces octal digits (0-7 ), and 0x hexadecimal digits (0-f ). Signed argument. |
d or u | Decimal integer | Any number of decimal digits (0-9 ), optionally preceded by a sign (+ or - ). d is for a signed argument, and u for an unsigned. |
o | Octal integer | Any number of octal digits (0-7 ), optionally preceded by a sign (+ or - ). Unsigned argument. |
x | Hexadecimal integer | Any number of hexadecimal digits (0-9 , a-f , A-F ), optionally preceded by 0x or 0X , and all optionally preceded by a sign (+ or - ). Unsigned argument. |
f , e , g | Floating point number | A series of decimal digits, optionally containing a decimal point, optionally preceeded by a sign (+ or - ) and optionally followed by the e or E character and a decimal integer (or some of the other sequences supported by strtod). Implementations complying with C99 also support hexadecimal floating-point format when preceded by 0x or 0X . |
a | ||
c | Character | The next character. If a width other than 1 is specified, the function reads exactly width characters and stores them in the successive locations of the array passed as argument. No null character is appended at the end. |
s | String of characters | Any number of non-whitespace characters, stopping at the first whitespace character found. A terminating null character is automatically added at the end of the stored sequence. |
p | Pointer address | A sequence of characters representing a pointer. The particular format used depends on the system and library implementation, but it is the same as the one used to format %p in fprintf. |
[ characters ] | Scanset | Any number of the characters specified between the brackets. A dash (- ) that is not the first character may produce non-portable behavior in some library implementations. |
[^ characters ] | Negated scanset | Any number of characters none of them specified as characters between the brackets. |
n | Count | No input is consumed. The number of characters read so far from stdin is stored in the pointed location. |
% | % | A % followed by another % matches a single % . |
我们前面例子中的[^\n]
就符合其中[^
characters ]
一栏,表示读入除了换行符\n
以外的任何字符。
所以%[^\n]
表示读入除了\n
以外任意字符,但是没有读入最后输入的\n
,而%*c
的作用是读入这个\n
并且遗弃(*
)。
参考资料
[1] scanf