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

@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.

Leave a Comment