Why is adding a leading space in a scanf format string recommended?

I am currently reading this book "C11 Programming for beginners" and in the scanf() chapter it says:

"Always add a leading space before the first control string character to ensure accurate character input." As in:

scanf(" %s", whatever);

The control string " %s", has a space before it. I know it sounds pretty self-explanatory, but I don't really get what could go wrong, and how this space ensures accurate character input.


Solution 1:

@WhozCraig well stated shortcomings to this advice. Its comes without rational nor detail. Further it does not apply to "%s" as "%s" consumes leading white-space with or without a leading space.

A leading white-space, be it ' ', '\t', '\n', etc. all do the same thing: direct scanf() to consume and not store optional leading white-space char. This is useful as typical usage of previous scanf() does not consume the user's '\n' from the Enter

scanf("%d", &some_int);
scanf("%c", &some_char);  // some_char is bound to get the value '\n'

All scanf() input specifiers ignore leading spaces, except 3: "%c", "%n", "%[]".

Simple directives do benefit with the leading space as in the following. Previous left-over white-space is consumed before '$'.

int Money;
scanf(" $%d", &Money);

Often, though not always, a leading space before "%c" is beneficial as when reading a single char of user input.

char ch;
scanf(" %c", &ch);

What is most wrong with the advice is that 1) when using "%s", supplying a width parameter is essential to robust code and 2) the return value should be checked.

char buf[30];
int cnt = scanf("%29s", buf);
if (cnt != 1) Handle_NoInput_or_EOF_IOError();

Note that all the conversion specifiers except %c, %[…] (scan sets) and %n skip leading white space automatically, so the advice is not really relevant with %s, or %d or %lf, etc.

Lastly, I recommend using fgets() rather than scanf() whenever one can — which is usually the case.

Solution 2:

"Always add a leading space before the first control string character to ensure accurate character input."

This is to consume any trailing white space characters or leading white space characters in the stdin that might have been left by previous user input (like the carriage return), before the scanf reads the user input. Of course, all the conversions except %c, %[…] (scan sets) and %n do this automatically, so the advice is not really relevant with %s.