Как разобрать строку, содержащую последовательность данных прямоугольников?
Я должен разобрать строку, содержащую некоторые данные в следующем формате:
- изображение, указанное в строке, связано с нулем, одним или несколькими прямоугольниками;
- координаты прямоугольника заключены в скобки и образованы четырьмя целыми числами, разделенными запятыми;
- каждый прямоугольник отделен от следующего запятой;
- строка заканчивается точкой с запятой.
Пример строки:
"image.png": (xmin, ymin, xmax, ymax), (xmin, ymin, xmax, ymax);
Я хотел бы получить следующую информацию:
string
содержащий имя файла изображения, напримерimage.png
;vector<Rect>
содержащий последовательность прямоугольников.
Rect является структурой, определенной ниже:
struct Rect
{
int xmin;
int ymin;
int xmax;
int ymax;
}
Как решить проблему простым способом, не используя внешние библиотеки?
2 ответа
Чтобы решить проблему простым способом, вы можете использовать средства автоматизации с переключателем. Вам нужно всего 10 состояний. Список состояний приведен ниже:
INIT,FILENAME,COLON,PARENTHSIS,XMIN,YMIN,XMAX,YMAX,COMMA,ACCEPT. Иници state
является INIT
, Таким образом, оператор регистра переключателя:
ch = getNextChar();
switch( state )
{
case INIT:
if( ch == '\"' )
state = FILENAME;
break;
case FILENAME:
if( ch != '\"' )
filename.append(ch);
else
state = COLON;
break;
case COLON:
// more cases;
// ...
default:
}
таким образом, вы можете легко разобрать эту строку.
Попробуйте лязг. Как:
clang++ -std=c++0x -stdlib=libc++ yourfile.cpp
Clang 3.3 поддерживает регулярные выражения. Работает на Linux, если это необходимо.