Получить количество символов, прочитанных sscanf?

я разбираю строку (a char*) и я использую sscanf для разбора чисел из строки в двойники, например:

// char* expression;
double value = 0;
sscanf(expression, "%lf", &value);

это отлично работает, но я хотел бы продолжить разбор строки с помощью обычных средств. Мне нужно знать, сколько символов было разобрать sscanf чтобы я мог возобновить разбор вручную из нового смещения.

очевидно, самым простым способом было бы каким-то образом вычислить количество символов, которые sscanf парсит, но если нет простого способа сделать это, я am открыть альтернативные варианты двойного синтаксического анализа. Однако, в настоящее время я использую sscanf потому что это быстро, просто и читаемо. В любом случае, мне просто нужен способ оценить дубль и продолжить разбор после него.

2 ответов


вы можете использовать спецификатор формата %n и до sscanf():

int pos;
sscanf(expression, "%lf%n", &value, &pos);

описание спецификатора формата n из стандарта C99:

вход не потребляется. соответствующий аргумент должен быть указателем на целое число со знаком, в которое должно быть записано количество символов, считанных из входного потока до сих пор этим вызовом fscanf функции. Исполнение %n директива не увеличивает количество назначений, возвращаемых при завершении выполнения


int i, j, k;
char s[20];

if (sscanf(somevar, "%d %19s %d%n", &i, s, &j, &k) != 3)
    ...something went wrong...

переменная k содержит количество символов до точки, где конец целого числа хранится в j была отсканирована.

отметим, что %n не учитывается в успешных преобразованиях. Вы можете использовать %n несколько раз в строке формата, если вам нужно.