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

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

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

Это 9X_string-parsing отлично работает, но затем я хотел бы продолжить 9X_fscanf синтаксический анализ строки обычными средствами. Мне 9X_c нужно знать, сколько символов было проанализировано 9X_sscanf sscanf, чтобы я мог возобновить ручной синтаксический 9X_scanf анализ с нового смещения.

Очевидно, что проще 9X_fscanf всего было бы каким-то образом подсчитать 9X_sscanf количество символов, которые анализирует 9X_scanf sscanf, но если нет простого способа сделать это, я 9X_string-parsing открыт для альтернативных вариантов двойного 9X_sscanf анализа. Однако в настоящее время я использую 9X_sscanf sscanf, потому что он быстрый, простой и читаемый. В 9X_fscanf любом случае, мне просто нужен способ оценить 9X_string-parsing double и продолжить синтаксический анализ 9X_scanf после него.

35
0
2
Общее количество ответов: 2

Ответ #1

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

Вы можете использовать спецификатор формата 9X_scanf %n и предоставить дополнительный аргумент 9X_string-parsing int * для sscanf():

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

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

Никакие входные данные не 9X_fscanf используются. Соответствующий аргумент должен быть указателем на целое число со знаком, в которое должно быть записано количество символов, считанных из входного потока на данный момент этим вызовом функции fscanf. Выполнение директивы %n не 9X_fscanf увеличивает счетчик присваиваний, возвращаемый 9X_sscanf при завершении выполнения функции fscanf. Никакой 9X_string-parsing аргумент не преобразуется, но один из них 9X_string-parsing используется. Если спецификация преобразования 9X_fscanf включает запрещающий присваивание символ 9X_scanf или ширину поля, поведение не определено.

Всегда 9X_fscanf проверяйте возвращаемое значение sscanf(), чтобы 9X_scanf убедиться, что присвоения были выполнены, и 9X_scanf последующий код не обрабатывает по ошибке 9X_c переменные, значения которых не изменились:

/* 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'. */
}

51
1

  • Я не могу заставить его работать для [реализации Microsoft] (https://msdn.microsoft.com/en-us/library/t6z7bya3.aspx?f ...

Ответ #2

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

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

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

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

Обратите внимание, что 9X_c %n не учитывается в успешных преобразованиях. При 9X_string-parsing необходимости вы можете использовать %n несколько 9X_sscanf раз в строке формата.

4
0