getline
function
The GNU library provides the nonstandard
getline
function that makes it easy to read lines
reliably:
#include <stdio.h> ssize_t getline(char **lineptr, size_t *n, FILE *stream);
This function reads an entire line from
stream
, storing the text (including the newline and a
terminating null character) in a buffer and storing the buffer address in
*lineptr
. Before calling getline
, you should
place in *lineptr
the address of a buffer *n
bytes long, allocated with malloc
. If this buffer is long
enough to hold the line, getline
stores the line in this
buffer. Otherwise, getline
makes the buffer bigger using
realloc
, storing the new buffer address back in
*lineptr
and the increased size back in
*n
.
When getline returns, *lineptr
is a
char *
which points to the text of the line. When
successful, it returns the number of characters read (including the
newline, but not including the terminating null); if an error occurs or
end of file is reached, getline
returns -1.
When you have to read in a line of text from
the keyboard, do it with getline
; you will avoid
future problems.
The following program demonstrates how to use
getline
to read a line of text from the keyboard safely. Try
typing more than 10 characters. Notice that getline
can
safely handle that line, no matter how long it is.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | #include <stdio.h> #define MAX_LENGTH 10 int main(void) { ssize_t bytes_read; size_t bytes_number; //size_t and ssize_t are unsigned int types. char *string; puts("Please enter a line of text:\n"); /* You can initialize the arguments by yourself: */ //bytes_number = MAX_LENGTH; //string = (char *) malloc (bytes_number+ 1); //bytes_read = getline(&string, &bytes_number, stdin); /*Or let getline do it for you by setting the number to 0 and the string to NULL.*/ bytes_number = 0; string = NULL; bytes_read = getline(&string, &bytes_number, stdin); if (bytes_read == -1) { puts("ERROR!"); } else { puts("You typed:"); puts(string); } free(string) return 0; } |
Check with these questions if you understood this document
Mark the WRONG sentence regarding the getline
function: