As we have seen in the last section, when using functions
gets
and scanf
to read in a sequence of
characters, your program will eventually fail, because these functions do
not control if the user types more characters than the maximum size of the
array that has to hold them. To avoid this, C has two more functions which
make the user input reading safer: fgets
and
getline
.
fgets
function
The syntax of the fgets
function is the
following:
#include <stdio.h> char *fgets(char *s, int n, FILE *stream);
Here s
references a character array that is
used to store characters read from the opened file pointed to by
stream
. n
specifies the maximum number of array
elements. The function reads a sequence of up to n-1
characters from the file referenced by stream
, and writes it
to the buffer indicated by s
, appending the string terminator
character '\0'. If a newline character('\n') is read, it also stops and
the string written to the buffer is terminated after the newline character
(so this character is also included). The function returns the pointer to
the string buffer if anything was written to it, or a null pointer if an
error occurred or if the file position indicator was at the end of the
file. If you have entered more characters than what the function has the
capacity to read, you will have to clear the buffer in order not to get
those remain characters in the next fgets
call.
fgets
is safer than gets
, but
this function involved a little more work basically because of two
issues. One is that, if you have entered more characters than what the
function has the capacity to read, you will have to clear the buffer in
order not to get those remain characters in the next fgets
call. The second issue is that you have to get rid of the newline
character which fgets
stores in the array.