Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > C Programming > spaces in scanf format string

Reply
Thread Tools

spaces in scanf format string

 
 
stathisgotsis@hotmail.com
Guest
Posts: n/a
 
      11-05-2006
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.

 
Reply With Quote
 
 
 
 
Richard Heathfield
Guest
Posts: n/a
 
      11-05-2006
http://www.velocityreviews.com/forums/(E-Mail Removed) 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)
 
Reply With Quote
 
 
 
 
Eric Sosman
Guest
Posts: n/a
 
      11-05-2006
(E-Mail Removed) 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
(E-Mail Removed)lid
 
Reply With Quote
 
stathisgotsis@hotmail.com
Guest
Posts: n/a
 
      11-05-2006
Ο/Η Eric Sosman *γραψε:

> 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.

 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
(f)scanf Question - Grab String of Spaces NvrBst C Programming 12 04-10-2009 08:28 PM
Re: How to trim a String trailing spaces, but not leading spaces? Roedy Green Java 3 09-14-2008 02:10 AM
Re: How to trim a String trailing spaces, but not leading spaces? John B. Matthews Java 4 09-12-2008 05:28 AM
difference between scanf("%i") and scanf("%d") ??? perhaps bug inVS2005? =?ISO-8859-1?Q?Martin_J=F8rgensen?= C Programming 18 05-02-2006 10:53 AM
scanf (yes/no) - doesn't work + deprecation errors scanf, fopen etc. =?ISO-8859-1?Q?Martin_J=F8rgensen?= C Programming 185 04-03-2006 02:49 PM



Advertisments