int splitString(AnsiString &src, AnsiString &dest1, AnsiString &dest2, AnsiString &dest3, char delim)
{
int iRes = 0;
dest1 = "";
dest2 = "";
dest3 = "";
char *ch = src.c_str();
if(*ch==delim)
{
ch++;
char *cLast = strchr(ch, delim);
if(*cLast) // Первое слово
{
iRes = 1;
*cLast = '\0';
dest1 = ch;
*cLast = delim;
ch = cLast + 1;
if(*ch)
{
cLast = strchr(ch, delim);
if(*cLast) // Второе слово
{
iRes = 2;
*cLast = '\0';
dest2 = ch;
*cLast = delim;
ch = cLast + 1;
if(*ch) // Третье слово
{
iRes = 3;
dest3 = ch;
}
}
}
}
}
return iRes;
}
необзодимо из строки выдернуть переменные
вида #firststring#secondstring#thirdstring хранящаяся в переменной s(AnsiString), необходимо чтобы все три строки были помещены в три разные переменные, т.е. например переменной s1 присвоить firststring, s2 - secondstring и наконец s3 - thirdstring. firststring и secondstring обычные слова без пробелов, а вот thirdstring может быть как словом, так и предложением, заевршающей решетки(после thirdstring) нет, вместо нее(решетки) может быть любой другой разделитель, если это необходимо. заранее благодарен.
Попробуй через TStringList: свойство CommaText, предварительно поэкспериментировав со свойствами CommaChar и DelimitedChar.
Код:
const char* str = "#firststring#secondstring#thirdstring";
stringstream ss(str);
string tmp, s1, s2, s3;
getline(ss, tmp, '#');
getline(ss, s1, '#');
getline(ss, s2, '#');
getline(ss, s3, '#');
stringstream ss(str);
string tmp, s1, s2, s3;
getline(ss, tmp, '#');
getline(ss, s1, '#');
getline(ss, s2, '#');
getline(ss, s3, '#');
Код:
const char* str = "#firststring#secondstring#thirdstring";
stringstream ss(str);
string tmp, s1, s2, s3;
getline(ss, tmp, '#');
getline(ss, s1, '#');
getline(ss, s2, '#');
getline(ss, s3, '#');
stringstream ss(str);
string tmp, s1, s2, s3;
getline(ss, tmp, '#');
getline(ss, s1, '#');
getline(ss, s2, '#');
getline(ss, s3, '#');
#include <sstream>
using namespace std;
и что-то типа
Код:
int splitString(AnsiString &src, AnsiString &dest1, AnsiString &dest2, AnsiString &dest3, char delim)
{
stringstream ss(src.c_str());
string tmp;
getline(ss, tmp, delim);
getline(ss, tmp, delim);
dest1 = tmp.c_str();
getline(ss, tmp, delim);
dest2 = tmp.c_str();
getline(ss, tmp, delim);
dest3 = tmp.c_str();
int iRes = 0;
if(dest3!="")
iRes = 3;
else if(dest2!="")
iRes = 2;
else if(dest1!="")
iRes = 1;
return iRes;
}
{
stringstream ss(src.c_str());
string tmp;
getline(ss, tmp, delim);
getline(ss, tmp, delim);
dest1 = tmp.c_str();
getline(ss, tmp, delim);
dest2 = tmp.c_str();
getline(ss, tmp, delim);
dest3 = tmp.c_str();
int iRes = 0;
if(dest3!="")
iRes = 3;
else if(dest2!="")
iRes = 2;
else if(dest1!="")
iRes = 1;
return iRes;
}
Храните деньги в сберегательной кассе, а строковые переменные в std::string ! :D
S - строка
Delimeter-разделитель
Parts-TStrings зарание созданая методом Create,тут будут все слова.Если надо будет узнать кол-во слов - метод couth(или как он там).
Код:
procedure StrBreakApart(const S, Delimeter: string; Parts: TStrings);
var
CurPos: integer;
CurStr: string;
begin
Parts.clear;
Parts.BeginUpdate();
try
CurStr := S;
repeat
CurPos := Pos(Delimeter, CurStr);
if (CurPos > 0) then
begin
Parts.Add(Copy(CurStr, 1, Pred(CurPos)));
CurStr := Copy(CurStr, CurPos + Length(Delimeter),
Length(CurStr) - CurPos - Length(Delimeter) + 1);
end
else
Parts.Add(CurStr);
until CurPos = 0;
finally
Parts.EndUpdate();
end;
end;
var
CurPos: integer;
CurStr: string;
begin
Parts.clear;
Parts.BeginUpdate();
try
CurStr := S;
repeat
CurPos := Pos(Delimeter, CurStr);
if (CurPos > 0) then
begin
Parts.Add(Copy(CurStr, 1, Pred(CurPos)));
CurStr := Copy(CurStr, CurPos + Length(Delimeter),
Length(CurStr) - CurPos - Length(Delimeter) + 1);
end
else
Parts.Add(CurStr);
until CurPos = 0;
finally
Parts.EndUpdate();
end;
end;
S - строка
Delimeter-разделитель
Parts-TStrings зарание созданая методом Create,тут будут все слова.Если надо будет узнать кол-во слов - метод couth(или как он там).
skipped
[/QUOTE]Из-за абстрактных методов не можно создать объект TStrings, нужен TStringList. И так как строка начинается с delimiter, сперва будет добавлена лишняя пустая строка.
Код:
void Splitting (AnsiString Sourse, AnsiString Find, DynamicArray<AnsiString> &Dest)
{[INDENT]
Dest.Lenght = 0; // Обнуляем массив результатов
for (int Pos ; (Pos = Sourse.Pos (Find)) > 0; )
{[INDENT]Dest.Lenght = Dest.Lenght +1; // Увеличиваем размер массива
Dest [Dest.High] = Sourse.SubString (1, Pos-1); // Копирование фрагмента строки в массив
Sourse.Delete (1, Pos); // Удаление фрагмента строки
[/INDENT]}
Dest.Lenght = Dest.Lenght +1; // Увеличиваем размер массива
Dest [Dest.High] = Sourse; // Копирование фрагмента
[/INDENT]}
{[INDENT]
Dest.Lenght = 0; // Обнуляем массив результатов
for (int Pos ; (Pos = Sourse.Pos (Find)) > 0; )
{[INDENT]Dest.Lenght = Dest.Lenght +1; // Увеличиваем размер массива
Dest [Dest.High] = Sourse.SubString (1, Pos-1); // Копирование фрагмента строки в массив
Sourse.Delete (1, Pos); // Удаление фрагмента строки
[/INDENT]}
Dest.Lenght = Dest.Lenght +1; // Увеличиваем размер массива
Dest [Dest.High] = Sourse; // Копирование фрагмента
[/INDENT]}
всем большое спасибо!
Юзайте FLEX =)
Типа как регулярные выражения в ПХП или ПЕРЛЕ =).
Он полностью весь документ может распарсить по константам =)
----
Другой способ - конечные автоматы =) пишешь и тож юзаешь =)
тут вообще 3-и строчки кода будет.