Использование sscanf () в C для получения переменного числа подстрок - PullRequest
0 голосов
/ 21 мая 2019

Итак, я пишу парсер на C для языка ассемблера.У меня есть макросы, которые могут принимать любую из следующих форм:

# label
# dat variable_name, 3

Как я могу использовать один sscanf (или другой метод) для разделения выражения на различные компоненты.

Например, идентификатор(для метки и данных), переменная (для имени переменной) и значение (для значения)

1 Ответ

1 голос
/ 22 мая 2019

Как я могу использовать один sscanf (или другой метод) для разделения выражения на различные компоненты.

Используйте "%n", чтобы записать ход сканирования.

char label_dat[10 + 1];
char var_name[20 + 1];
int var_val; 
int n1 = 0;
int n2 = 0;
//               v-------v----v---- Tolerate trailing whitespace                  
sscanf(s, "# %10s %n %20s , %d %n", label_dat, &n1, var_name, &var_val, &n2);

// If scanning made it to `n1` and there was no more text
if (n1 && s[n1] == '\0') {
  printf("Label '%s'\n", label_dat);
// If scanning made it to `n2` and there was no more text
} else if (n2 && s[n2] == '\0') {
  printf("Data '%s', Name '%s', Value %d\n", label_dat, var_name, var_val);
} else {
  puts("Bad input");
}

Требуется больше кода, если после # и , требуется пробел.

...