Submitter: Fred J. Tydeman
Submission Date: 2016-03-29
Document: WG14 N2033

Summary

Example 5 in 7.21.6.2 fscanf appears to be wrong.

7.21.6.2#22 has:

EXAMPLE 5 The call:

  #include <stdio.h>
  /* ... */
  int n, i;
  n = sscanf("foo  %  bar  42", "foo%%bar%d", &i);

will assign to n the value 1 and to i the value 42 because input white-space characters are skipped for both the % and d conversion specifiers.

Yet, my reading of the standard says it should fail (which is what most implementations do).

I can see that #6 causes the 'foo' directive to match 'foo' of the input.

I can see that #8 causes the '%%' directive to match '%' and its leading spaces (but not trailing spaces) of the input.

I cannot find anything that causes the spaces between the '%' and the 'bar' of the input to be matched when the 'bar' directive is processed, so the scan fails.

#15 is the only mention of trailing white space that I see.

Suggested Technical Corrigendum

In 7.21.6.2#22, change:


n = sscanf("foo  %  bar  42", "foo%%bar%d", &i);

to:


n = sscanf("foo  %  bar  42", "foo%% bar%d", &i);

That is, add a space between '%%' and 'bar'.