Получить количество символов, прочитанных 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 после него.
Ответ #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'. */
}
- Я не могу заставить его работать для [реализации 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 раз в строке формата.
-
8
-
68
-
3
-
9
-
4
-
5
-
14
-
4
-
9
-
6
-
10
-
2
-
6
-
5
-
2
-
4
-
4
-
4
-
4
-
2
-
5
-
15
-
5
-
6
-
4
-
17
-
3
-
4
-
1
-
2
-
5
-
8
-
6
-
6
-
2
-
3
-
5
-
8
-
3
-
8
-
4
-
3
-
5
-
9
-
9
-
3
-
1
-
4
-
4
-
4