Я пытаюсь разобрать набор строк и извлечь определенные части строки на основе исходного формата (чтение файла конфигурации).
Еще немного объяснений: формат может содержать до 4 части для форматирования.В этом случае %S
пропустит часть, %a-%c
извлечет часть и будет рассматриваться как строка, %d
как int.
То, что я пытаюсь сделать сейчас, - это придуматькакой-то умный способ разобрать это.До сих пор я придумал следующий прототип.Тем не менее, моя арифметика указателей все еще нуждается в некоторой работе для пропуска / извлечения частей.
В конечном итоге каждая часть будет сохранена в массиве структур.
Редактировать: с использованием sscanf
может не работать в этом случае, так как формат указан в файле конфигурации.Кроме того, формат может масштабироваться, строка (и тип) может меняться.
#include <stdio.h>
#include <string.h>
#define DIM(x) (sizeof(x)/sizeof(*(x)))
void process (const char *fmt, const char *line) {
char c;
const char *src = fmt;
while ((c = *src++) != '\0')
{
if (c == 'S'); // skip part
else if (c == 'a'); // extract %a
else if (c == 'b'); // extract %b
else if (c == 'c'); // extract %c
else if (c == 'd'); // extract %d (int)
else {
printf("Unknown format\n");
exit(1);
}
}
}
static const char *input[] = {
"bar 200.1 / / (zaz) - \"bon 10\"",
"foo 100.1 / / (baz) - \"apt 20\"",
};
int main (void) {
const char *fmt = "%S %a / / (%b) - \"%c %d\"";
size_t i;
for(i = 0; i < DIM (input); i++)
{
process (fmt, input[i]);
}
return (0);
}