I'm parsing a string (a char*
) and I'm using sscanf
to parse numbers from the string into doubles, like so:
// char* expression;
double value = 0;
sscanf(expression, "%lf", &value);
This works great, but I would then like to continue parsing the string through conventional means. I need to know how many characters have been parsed by sscanf
so that I may resume my manual parsing from the new offset.
Obviously, the easiest way would be to somehow calculate the number of characters that sscanf
parses, but if there's no simple way to do that, I am open to alternative double parsing options. However, I'm currently using sscanf
because it's fast, simple, and readable. Either way, I just need a way to evaluate the double and continue parsing after it.
You can use the format specifier %n
and provide an additional int *
argument to sscanf()
:
int pos;
sscanf(expression, "%lf%n", &value, &pos);
Description for format specifier n
from the C99 standard:
No input is consumed. The corresponding argument shall be a pointer to signed integer into which is to be written the number of characters read from the input stream so far by this call to the
fscanf
function. Execution of a%n
directive does not increment the assignment count returned at the completion of execution of thefscanf
function. No argument is converted, but one is consumed. If the conversion specification includes an assignment suppressing character or a field width, the behavior is undefined.
Always check the return value of sscanf()
to ensure that assignments were made, and subsequent code does not mistakenly process variables whose values were unchanged:
/* Number of assignments made is returned,
which in this case must be 1. */
if (1 == sscanf(expression, "%lf%n", &value, &pos))
{
/* Use 'value' and 'pos'. */
}