[comp.lang.c] elementary scanf questions

mef@hithere.silvlis.com (Mary Ellen Foley) (11/23/89)

I have a book which says that, if you want to read in a line
at a time from standard input, you can use scanf("[^\n]\n",buffer);
Okay, you can use gets, too, and I don't know why they don't, 
unless they just want to make a point about scanf.   So....

#include <stdio.h>
main()
{
    int result;
    char buff[1024];

    do
    {
	result = scanf("%[^\n]\n",buff);
	printf("result --> %d, buff --> %s\n",result,buff);
    }
    while (result != EOF);
}


...seems to give the expected result  on an Apollo DN4000 under
sr10.1 only if I give the EOF char (^Z) twice, if I'm running it
interactively.  On the SUN (model ??) running OS 4.2 (?) (sorry, I
don't know much about SUNS),I only have to give the EOF char (^D) 
once.  Also, on both machines, control doesn't return from scanf
until the second line of input has gone in.  That is, interactively
(on SUN) your window looks like:
   foo
   bar
   result --> 1, buff --> foo
   bas
   result --> 1, buff --> bar
   (^D here, but doesn't show on the screen)
   result --> 1, buff --> bas
   result --> -1, buff --> bas


What's going on, some sort of buffering?  Where can I read about
stuff like this?  

Another book tells me that scanf is slow and compiles into a
large amount of code, but didn't say why.  Clearly, I need
a better set of books...

Please post answers, e-mail to my site has been flaky since our
sysadmin left (anybody out there want a sysadmin job?  SUN and
Apollo and DEC equipment.  Call me at 408-991-6056 for details.)

If I've overlooked something obvious, please don't flame me, just
correct me.