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;
}
разбивка строки на лексемы
имеем строку вида С(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)
не могу придумать
естественно, поскольку вводится все пользователем то пробелов м.у операторами операндами может и не быть , знаки операций могут состоять из одного или двух символов.
В общем нужно как то разбить строку на отдельные составляющие.
Код:
Возвращает массив разделенных элементов, а переменная num содержит их количество. Писал не проверяя, может, где по мелочи и ошибся, но по сути где-то так.
А std::sscanf не катит?
"([Cc]\s*\([0-9]*\s*,\s*[0-9]*\)|\s*[+-]\s*|\s*<=\s*|\s*:=\s*)"
Нужно только заюзать какую-то сишную библиотечку обработки регулярных выражений, например PCRE