Как разобрать строку, содержащую последовательность данных прямоугольников?

Я должен разобрать строку, содержащую некоторые данные в следующем формате:

  • изображение, указанное в строке, связано с нулем, одним или несколькими прямоугольниками;
  • координаты прямоугольника заключены в скобки и образованы четырьмя целыми числами, разделенными запятыми;
  • каждый прямоугольник отделен от следующего запятой;
  • строка заканчивается точкой с запятой.

Пример строки:

"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, если это необходимо.

Другие вопросы по тегам