Newline character is not consumed in typical scanf call
suggest changeWhen this program
#include <stdio.h> #include <string.h> int main(void) { int num = 0; char str[128], *lf; scanf("%d", &num); fgets(str, sizeof(str), stdin); if ((lf = strchr(str, '\n')) != NULL) *lf = '\0'; printf("%d \"%s\"\n", num, str); return 0; }
is executed with this input
42 life
the output will be 42 ""
instead of expected 42 "life"
.
This is because a newline character after 42
is not consumed in the call of scanf()
and it is consumed by fgets()
before it reads life
. Then, fgets()
stop reading before reading life
.
To avoid this problem, one way that is useful when the maximum length of a line is known – when solving problems in online judge syste, for example – is avoiding using scanf()
directly and reading all lines via fgets()
. You can use sscanf()
to parse the lines read.
#include <stdio.h> #include <string.h> int main(void) { int num = 0; char line_buffer[128] = "", str[128], *lf; fgets(line_buffer, sizeof(line_buffer), stdin); sscanf(line_buffer, "%d", &num); fgets(str, sizeof(str), stdin); if ((lf = strchr(str, '\n')) != NULL) *lf = '\0'; printf("%d \"%s\"\n", num, str); return 0; }
Another way is to read until you hit a newline character after using scanf()
and before using fgets()
.
#include <stdio.h> #include <string.h> int main(void) { int num = 0; char str[128], *lf; int c; scanf("%d", &num); while ((c = getchar()) != '\n' && c != EOF); fgets(str, sizeof(str), stdin); if ((lf = strchr(str, '\n')) != NULL) *lf = '\0'; printf("%d \"%s\"\n", num, str); return 0; }
Found a mistake? Have a question or improvement idea?
Let me know.
Table Of Contents