mixing scanf and gets

Root Boy Jim rbj at icst-cmr
Wed Apr 9 10:11:25 AEST 1986


	yoda at ittatc.ATC.ITT.UUCP (Todd C. Williams [Jedi Knight]) writes:
	>Is it possible to use gets() after scanf() ?
	>Is it a good idea to try to use gets() after scanf() ?
	>It doesn't work, so I tried adding "fflush(stdin);" 
	>just before the gets(), but that doesn't help either.
	>If I do 2 "gets(str)"'s in a row, the second one works.
	>
	>Apparently, the scanf() is reading UP TO the newline, but
	>leaving that newline in the buffer; the gets() sees the
	>newline and thinks it is finished.

So what's the problem? Use gets after scanf to eat the \n.
	
Doug Gwyn replys:

	scanf() does whatever you tell it to with the input stream
	then stops.  If you make it eat newlines, it will.  There
	should be no problem mixing any of the STDIO input methods.
	
	However, it sounds to me like your application would be
	programmed better with the following scheme:
	
		while get-a-line-using-fgets
			parse-line-with-sscanf
	
The way I understand it, scanf will eat input only as far as
makes sense, ungetc'ing the rest. The problem with sscanf is that
if your input only partially matches, there is no way to tell
where `the rest' begins. Or am I in outer space?

	By the way, don't use gets(); your input buffer can be
	overrun if an input line is very long, resulting in
	unpredictable malfunctioning of your application.  When

Agreed. Gets is `obseleted' by fgets.

	you use fgets(), it is often wise to test the last
	character in the record and if it is a newline, replace
	it with a 0 string terminator before parsing the record.
	
Which brings me to another point. Fgets is worthless on binary
data. It returns its first argument, which I already know.
If a null is part of the data, how do you know where it stopped
reading. Well if you're lucky, there will be a newline in there
and that's the end of it. But if you're reading blocks of nulls,
you're SOL. I would like fgets to return the number of chars read.

	(Root Boy) Jim Cottrell		<rbj at cmr>
	Baseball in D.C. in `87!



More information about the Comp.lang.c mailing list