Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

разбивка строки на лексемы

25K
28 августа 2009 года
San_
42 / / 03.10.2007
подскажите алгоритм плиз
имеем строку вида С(5,1) := C(1,2) + c(1,3) + c (1,4)
или такого
С(5,1) - C(1,2) <= c(1,3) + c (1,4)

где :
с(x,y) координаты некоторой ячейки в TStringGrid (пишу в Builder C++);
пользователь вводит некоторые числа , а программа проверяет их , в соответсвии с условиями , которые опять же где-то ввел другой пользователь

как проверять уже нашел , а вот как разбить строку
С(5,1) - C(1,2) <= c(1,3) + c (1,4)

на массив строк:
С(5,1)
-
С(1,2)
<=
С(1,3)
+
С(1,4)

не могу придумать
естественно, поскольку вводится все пользователем то пробелов м.у операторами операндами может и не быть , знаки операций могут состоять из одного или двух символов.
В общем нужно как то разбить строку на отдельные составляющие.
278
01 сентября 2009 года
Alexander92
1.1K / / 04.08.2008
Ну если работать с C-строками (а любые другие строки C++ легко в них переводятся), то можно написать, например:

Код:
char **ExplodeString(const char *my_string, int *num) {
   char *Result[1000];
   char *pmy_string = my_string;
   int k = 0;
   int curr_len = 0;
   const int ExplodeSymbolsNum = ... // количество разделительных элементов
   char *ExplodeSymbols[] = {"+", "-", "*", "/", "<=", ">=" ...};
   for (int j = 0; j < ExplodeSymbolsNum; j++) {
     if (strstr(pmy_string, ExplodeSymbols[j]) == pmy_string) {
        k++;
        z = 0;
        curr_len = 0;
        pmy_string += strlen(ExplodeSymbols[j]);
     } else {
        Result[k][strlen(Result[k])-1] = *pmy_string++;
        curr_len++;
        Result[k][curr_len] = '\0';
     }
   }
   *num = k;
   return Result;
}


Возвращает массив разделенных элементов, а переменная num содержит их количество. Писал не проверяя, может, где по мелочи и ошибся, но по сути где-то так.
260
01 сентября 2009 года
Ramon
1.1K / / 16.08.2003
А std::sscanf не катит?
29K
01 сентября 2009 года
Ander Skirnir
109 / / 08.06.2009
А можно регулярным выражением:
"([Cc]\s*\([0-9]*\s*,\s*[0-9]*\)|\s*[+-]\s*|\s*<=\s*|\s*:=\s*)"

Нужно только заюзать какую-то сишную библиотечку обработки регулярных выражений, например PCRE
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог