FGETS(3) | Library Functions Manual | FGETS(3) |
fgets
, gets
—
#include <stdio.h>
char *
fgets
(char
* restrict str, int
size, FILE * restrict
stream);
char *
gets
(char
*str);
fgets
() function reads at most one less than the
number of characters specified by size from the given
stream and stores them in the string
str. Reading stops when a newline character is found, at
end-of-file or error. The newline, if any, is retained, and a
‘\0
’ character is appended to end the
string.
The gets
() function is equivalent to
fgets
() with an infinite size
and a stream of stdin, except that
the newline character (if any) is not stored in the string. It is the
caller's responsibility to ensure that the input line, if any, is
sufficiently short to fit in the string.
fgets
() and
gets
() return a pointer to the string. If end-of-file
or an error occurs before any characters are read, they return
NULL
. The fgets
() and
gets
() functions do not distinguish between
end-of-file and error, and callers must use
feof(3) and
ferror(3) to determine which
occurred.
EBADF
]The function fgets
() may also fail and set
errno for any of the errors specified for the routines
fflush(3),
fstat(2),
read(2), or
malloc(3).
The function gets
() may also fail and set
errno for any of the errors specified for the routine
getchar(3).
fgets
() and gets
()
conform to ANSI X3.159-1989
(“ANSI C89”) and IEEE Std
1003.1-2001 (“POSIX.1”). The IEEE Std
1003.1-2008 (“POSIX.1”) revision marked
gets
() as obsolescent.
char buf[1024], *p; while (fgets(buf, sizeof(buf), fp) != NULL) { if ((p = strchr(buf, '\n')) == NULL) { fprintf(stderr, "input line too long.\n"); exit(1); } *p = '\0'; printf("%s\n", buf); }
While the error would be true if a line longer than 1023 characters were read, it would be false in two other cases:
fgets
() will not contain a newline either. Thus
strchr
() will return NULL
and the program will terminate, even if the line was valid.strchr
(),
correctly assume the end of the string is represented by a null
(‘\0’) character. If the first character of a line returned
by fgets
() were null,
strchr
() would immediately return without
considering the rest of the returned text which may indeed include a
newline.Consider using fgetln(3) instead when dealing with untrusted input.
gets
(). The gets
() function
exists purely to conform to ANSI X3.159-1989
(“ANSI C89”).
May 13, 2010 | NetBSD 9.2 |