Я пытаюсь использовать scanf()
для чтения строк формы mov r0, r1, r2
или ldr r0, [r1, 0x4]
в текстовом буфере, отрицая любые возможные квадратные скобки, запятые и пробелы. Следующий код не работает:
void ReadBuffer(const char* buffer)
{
char command[2048];
char var[3][2048];
sscanf(buffer,"%[^ ,[]\n\t] %[^ ,[]\n\t], %[^ ,[]\n\t], %[^ ,[]\n\t]", command, va[0], var[1], var[2]);
}
Как добавить квадратные скобки в отрицательный набор сканирований?
C 2018 описывает спецификаторы преобразования scanf
в 7.21.6.2 12, а для преобразования [
говорится:
… Если спецификатор преобразования начинается с
[]
или[^]
, символ правой скобки находится в списке сканирования, а следующий за ним символ правой скобки — это соответствующая правая скобка, завершающая спецификацию; в противном случае первый следующий символ правой скобки завершает спецификацию…
Поэтому ставьте ]
сразу после ^
. Символ [
может располагаться в любом месте списка сканирования (символы между [
и закрывающим ]
).
Пример:
#include <stdio.h>
int main(void)
{
char a[100], b, c[100], d, e[100], f;
int result = sscanf("foo[bar, baz]", " %[^][, ] %c %[^][, ] %c %[^][, ] %c", a, &b, c, &d, e, &f);
printf("scanf returned %d.\n", result);
printf("a = %s.\n", a);
printf("b = %c.\n", b);
printf("c = %s.\n", c);
printf("d = %c.\n", d);
printf("e = %s.\n", e);
printf("f = %c.\n", f);
}
Выход:
scanf returned 6. a = foo. b = [. c = bar. d = ,. e = baz. f = ].
Обратите внимание, что это кропотливый способ анализа ассемблерного кода. Обычно лучше написать собственный код на C для анализа символов, особенно после изучения некоторой теории синтаксического анализа, а еще лучше использовать готовый генератор лексического анализатора и генератор грамматического анализатора. Выполнение этого с помощью scanf
требует пристального внимания к возвращаемым значениям, размерам буфера и многому другому.
Спасибо за ваш ответ. Ваше решение помогло мне для закрывающей скобки, но не для открывающей. Функция прекращает чтение буфера, как только находит открывающую скобку.
«Следующий код не работает:» — как именно вы пытаетесь использовать этот код? Что произойдет, если вы попробуете это сделать, и чем это отличается от того, что вы ожидаете?