Defect Report #022

Submission Date: 10 Dec 92
Submittor: WG14
Source: X3J11/91-002 (Fred Tydeman)
Question 1
What is the result of: strtod("100ergs", &ptr);? Is it 100.0 or is it 0.0?
Subclause 7.10.1.4 The strtod function on page 150, lines 36-38 says: ``The subject sequence is defined as the longest initial subsequence of the input string, starting with the first non-white-space character, that is of the expected form.'' In this case, the longest initial subsequence of the expected form is 100, so 100.0 should be the return value. Also, since the entire string is in memory, strtod can scan it as many times as need be to find the longest valid initial subsequence.
Subclause 7.9.6.2 The fscanf function on page 136, lines 17-18 says: ``e,f,g Matches an optionally signed floating-point number, whose format is the same as expected for the subject string of the strtod function.'' Later, page 138, lines 6, 16, and 25 show that 100ergs fails to match %f. Those two show that 100ergs is invalid to fscanf and therefore, invalid to strtod. Then, subclause 7.10.1.4, page 151, lines 11-12, ``If no conversion could be performed, zero is returned'' indicates for an error input, 0.0 should be returned. The reason this is invalid is spelled out in the rationale document, subclause 7.9.6.2 The fscanf function, page 85: ``One-character pushback is sufficient for the implementation of fscanf. Given the invalid field -.x, the characters -. are not pushed back.'' And later, ``The conversions performed by fscanf are compatible with those performed by strtod and strtol.''
So, do strtod and fscanf act alike and both accept and fail on the same inputs, by the one-character pushback scanning strategy, or do they use different scanning strategies and strtod accept more than fscanf?
Correction
In subclause 7.9.6.2, page 135, lines 31-33, change:
An input item is defined as the longest matching sequence of input characters, unless that exceeds a specified field width, in which case it is the initial subsequence of that length in the sequence.
to:
An input item is defined as the longest sequence of input characters which does not exceed any specified field width and which is, or is a prefix of, a matching input sequence.
In subclause 7.9.6.2, page 137, delete:
If conversion terminates on a conflicting input character, the offending input character is left unread in the input stream.
Add to subclause 7.9.6.2, page 137:
If conversion terminates on a conflicting input character, the offending input character is left unread in the input stream.* [Footnote *: fscanf pushes back at most one input character onto the input stream. Therefore, some sequences that are acceptable to strtod, strtol, or strtoul are unacceptable to fscanf.]
Previous Defect Report < - > Next Defect Report