How to use scanf in C?
scanf格式详解
c语言中,你可能会遇到这样的scanf
输入形式:scanf("%[^\n]%*c",s);
,从而摸不着头脑——这是个什么意思呢?
我们慢慢分析,已知scanf
的格式说明符遵循以下原型[1]:
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