I was asked to do a work in C when I'm supposed to read from input until there's a space and then until the user presses enter.
If I do this:
scanf("%2000s %2000s", a, b);
I am smart
scanf("%2000s %2000[^\n]\n", a, b);
scanf("%2000s %2000[^\0]\0", a, b);
warning: no closing ‘]’ for ‘%[’ format
scanf (and cousins) have one slightly strange characteristic: any white space in the format string (outside of a scanset) matches an arbitrary amount of white space in the input. As it happens, at least in the default "C" locale, a new-line is classified as white space.
This means the trailing
'\n' is trying to match not only a new-line, but any succeeding white-space as well. It won't be considered matched until you signal the end of the input, or else enter some non-white space character.
To deal with this, you typically want to do something like this:
scanf("%2000s %2000[^\n]%c", a, b, c); if (c=='\n') // we read the whole line else // the rest of the line was more than 2000 characters long. `c` contains a // character from the input, and there's potentially more after that as well.