Hello everyone,
Trusting K&R2 i thought until recently that spaces are ignored in
scanf's format string. Reading arguments to the contrary confused me a
little. So i now ask:
Is scanf("%d%d",...) different from scanf("%d %d",...) in the
Standard's point of view?
Thank you.
|
|
0
|
|
|
|
Reply
|
stathisgotsis (127)
|
11/5/2006 5:10:27 PM |
|
stathisgotsis@hotmail.com said:
> Hello everyone,
>
> Trusting K&R2 i thought until recently that spaces are ignored in
> scanf's format string. Reading arguments to the contrary confused me a
> little. So i now ask:
>
> Is scanf("%d%d",...) different from scanf("%d %d",...) in the
> Standard's point of view?
From 4.9.6.2 fscanf:
"Input white-space characters (as specified by the isspace function)
are skipped, unless the specification includes a [ , c , or n
specifier."
--
Richard Heathfield
"Usenet is a strange place" - dmr 29/7/1999
http://www.cpax.org.uk
email: rjh at above domain (but drop the www, obviously)
|
|
0
|
|
|
|
Reply
|
invalid171 (6557)
|
11/5/2006 5:31:49 PM
|
|
stathisgotsis@hotmail.com wrote:
> Hello everyone,
>
> Trusting K&R2 i thought until recently that spaces are ignored in
> scanf's format string. Reading arguments to the contrary confused me a
> little. So i now ask:
>
> Is scanf("%d%d",...) different from scanf("%d %d",...) in the
> Standard's point of view?
They differ, but so subtly that it's a "difference that
makes no difference."
Suppose the input is " 12\t34\n". The "%d%d" format
matches this input as follows: The first "%d" skips the leading
white spaces and consumes and converts the 12, then the second
"%d" skips the tab and consumes and converts the 34. The newline
is left unread.
The "%d %d" format operates just a little differently, but
has the same outcome. The first "%d" skips the leading spaces
and converts the 12, then the space in the format matches and
skips the tab, then the second "%d" skips nothing and converts
the 34. As before, the newline is left unread.
So the only difference lies in whether the tab is consumed
by the second "%d" or by the space in the format string, and
this difference isn't detectable "from the outside." scanf()
has no way to tell you how many white space characters a "%d"
did or didn't consume before converting a number.
However, this doesn't mean that white space in the format
string is "ignored." Most conversion specifiers automatically
consume and ignore leading white spaces in the input until they
find something non-white they can try to convert, but a few do
not: "%c" and "%[" start converting immediately, whether the
input is white or not, and "%n" doesn't read any input at all.
So if you want white space skipped before one of these, you
need to put some white space in the format string: " %c" or
" %[" or " %n", for instance.
The other situation where it becomes obvious that white
space in the format is not ignored is when it appears at the
end of the format string -- which is usually a mistake made
by someone who doesn't quite understand the scanf() family yet.
Consider our sample input of " 12\t34\n" and imagine reading
it with scanf("%d%d\n", &x, &y). The two "%d" specifiers will
convert their numbers as before, but what will the format's "\n"
do? Hints: all white space in the format is equivalent in the
sense that it matches any kind of white space in the input, and
a format's white space can match any amount of white input. Try
to predict what will happen, and then try it for yourself.
--
Eric Sosman
esosman@acm-dot-org.invalid
|
|
0
|
|
|
|
Reply
|
esosman (1335)
|
11/5/2006 7:16:23 PM
|
|
=CE=9F/=CE=97 Eric Sosman =CE=AD=CE=B3=CF=81=CE=B1=CF=88=CE=B5:
> The other situation where it becomes obvious that white
> space in the format is not ignored is when it appears at the
> end of the format string -- which is usually a mistake made
> by someone who doesn't quite understand the scanf() family yet.
> Consider our sample input of " 12\t34\n" and imagine reading
> it with scanf("%d%d\n", &x, &y). The two "%d" specifiers will
> convert their numbers as before, but what will the format's "\n"
> do? Hints: all white space in the format is equivalent in the
> sense that it matches any kind of white space in the input, and
> a format's white space can match any amount of white input. Try
> to predict what will happen, and then try it for yourself.
Thank you and Richard for your answers.
I assume the statement above will try to consume all white space
until it encounters some non whitespace. I had never thought of this
before, so thank you for pointing this out as well.
|
|
0
|
|
|
|
Reply
|
stathisgotsis (127)
|
11/5/2006 10:59:01 PM
|
|
|
3 Replies
29 Views
(page loaded in 0.053 seconds)
|