On Wed, Jul 07, 1999 at 10:37:42AM +0100, Russell Coker wrote: > Running gdb on a core file after sending a SEGV to it when it's in this state I > find that it's at line 1102 of dspcom.c, the gets() in the following fragment: > s[0] = sx[0] = '\0'; > while (!sx[0]) > (void) gets (sx); > Does anyone know what they are trying to do here? It seems to be while STDIN > is closed do infinite loop... I'd guess the intent is to read a line, but ignore it if it's blank. A better replacement is something more like: int stringlen; do { if (!fgets(sx, sizeof(sx), stdin)) { if (errno != 0) { perror("stdin"); exit(1); } else { exit(0); } } stringlen = strlen(sx); if (stringlen > 1 && sx[stringlen-1] == '\n') sx[--stringlen] = '\0'; } while (i == 0); ie, call fgets. if fgets failed, either you're at eof, or there was a real error. otherwise, it succeeded, so get rid of the trailing \n, if there was one. keep doing this until you get some actual input. You can get rid of any of the error checking above that you don't like to make it more concise as appropriate. gets() is a buffer overrun waiting to happen, btw, and should never be used. fgets(buf,length_of_buf,stdin); is generally a drop in replacement. Cheers, aj (You could also do "while(!sx[0] && !feof(stdin)) gets(sx);" but that would still be icky and buggy. while(!sx[0] && gets(sx)); would probably work too.) -- Anthony Towns <aj@humbug.org.au> <http://azure.humbug.org.au/~aj/> I don't speak for anyone save myself. PGP encrypted mail preferred. ``There's nothing worse than people with a clue. They're always disagreeing with you.'' -- Andrew Over
Attachment:
pgp7pBiZT7TqJ.pgp
Description: PGP signature