> Is gets(s) equivalent to scanf("%[^\n]%*1[\n]",s)? I think it has at least one minor issue: it doesn't null-terminate the buffer on empty input i.e., just a newline as input. Regards, Ponnuvel On Tue, Feb 12, 2019 at 2:42 PM James Larrowe wrote: > I could probably try patching it. That C99 specification seems descriptive > enough. > > On Mon, Feb 11, 2019 at 10:51 PM Rich Felker wrote: > >> On Mon, Feb 11, 2019 at 10:48:38PM -0500, Rich Felker wrote: >> > On Mon, Feb 11, 2019 at 06:55:24PM -0800, Keyhan Vakil wrote: >> > > Hi. It seems that the gets function does not follow the C99 spec. In >> > > particular, if the input contains a null byte in the middle of the >> > > input, then the new-line character is not discarded. >> > > >> > > For reference, here's the relevant part in the C99 standard >> > > (7.19.7.7): >> > > >> > > > The gets function reads characters from the input stream pointed to >> > > > by stdin, into the array pointed to by s, until end-of-file is >> > > > encountered or a new-line character is read. Any new-line character >> > > > is discarded, and a null character is written immediately after the >> > > > last character read into the array. >> > > >> > > Here is an example: >> > > >> > > #include >> > > char s[8]; >> > > int main() { >> > > gets(s); >> > > for (int i = 0; i < sizeof s; i++) { >> > > printf("%02x ", s[i]); >> > > } >> > > printf("\n"); >> > > return 0; >> > > } >> > > >> > > When compiled against gcc: >> > > >> > > $ echo -e 'A\x00B' | ./a.out >> > > 41 00 42 00 00 00 00 00 >> > > >> > > When compiled against musl: >> > > >> > > $ echo -e 'A\x00B' | ./a.out >> > > 41 00 42 0a 00 00 00 00 >> > > >> > > Note the terminating newline, which contradicts the spec. >> > >> > I think this bug report is correct; however the gets function is >> > awful, removed in C11, and should never be used. :-) >> > >> > I will see what can be done to fix it though. >> >> Is gets(s) equivalent to scanf("%[^\n]%*1[\n]",s)? If so that would be >> an appropriately hideous way to implement it that avoids the current >> bug? :-) >> >> Rich >> > -- Regards, Ponnuvel P