C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Расшепление объекта AnsiString на слова, Как разделить предложение на составляющ
Mansur
Отправлено: 30.11.2003, 09:11


Не зарегистрирован







Как можно эффективно разделить объект AnsiString (в частности предложение) на отдельные его составляющие (слова) используя какого либо разделителя. В частности символа пропуска?
Или с друг словами: Есть ли аналогичные классы в C++ Builder соответсвующие к классам JAVA StringTokenizer и методы похожие nextToken()?
** pasha
Отправлено: 30.11.2003, 23:34


Не зарегистрирован







Есть такая функция в Biulder-e !
А можно и руками написать.


exp
Отправлено: 30.11.2003, 23:41


Мастер участка

Группа: Участник
Сообщений: 304



Люди, вы что, писать разучились. Нет метода — сам напишем что-нибудь вроде этого.

CODE


AnsiString Predlozhenie;
// трали-мули

AnsiString Slovo;
int i=0;
int nachalo_slova,konec_slova;
while(i<Predlozhenie.Length())
{
if(Predlozhenie[i]==' ')
{
nachalo_slova=i+1;
konec_slova=nachalo_slova;
while(konec_slova<Predlozhenie.Length())&&(Predlozhenie[konec_slova]!=' ') konec_slova++;
//между nachalo_slova и konec_slova — твое слово.Делай с ним,
// что хочешь: копируй, стирай, проверяй на матерность ...
i=--konec_slova;
}
i++;
}

Код написан на месте, поэтому работоспособность не гарантируется. По идее, должно работать. Не будет работать — ошибки посмотри, но вроде ничего серьезного не должно быть.

Ух ты, долго же я разглагольствовал.... biggrin.gif . **pasha меня уже опередил.

Отредактировано exp — 01/12/2003, 00:45
** pasha
Отправлено: 30.11.2003, 23:52


Не зарегистрирован







Да есть такой метод ! , завтра утром доберусь до работы — выложу
и метод и руками разделение, использовал и то и другое.

(Метод позволяет использовать разделители — пробел,
запятую и т,д, также написал свой простой метод -
утро вечера мудренее. smile.gif

Отредактировано Admin — 02/12/2003, 00:14
pasha
Отправлено: 01.12.2003, 10:54


Дежурный стрелочник

Группа: Участник
Сообщений: 62



Вот, нашел. Можно задать
несколько разделителей в этой функции.
Функция ExtractStrings().

CODE

TSysCharSet Tws,Tcs;
Tcs<<' '<<'+'; // разделители
AnsiString s = "xcgxc fgfrgdf fdg+gfdg tyhrthh+g fggg+gf vghgh";
ExtractStrings(Tcs,Tws,s.c_str(),ListBox1->Items);

Получаем в ListBox1 строки

xcgxc
fgfrgdf
fdg
gfdg
tyhrthh
g
fggg
gf
vghgh

--

Или написать/использовать свою, типа:

CODE

//---------------------------------------------------------------------------
int regfind(AnsiString s,AnsiString sim)
{
for(int j=1; j<s.Length(); j++){
for(int i=1; i<=sim.Length(); i++){
if(sim[i]==s[j]) return(s.Pos(sim[i]));
}}
return 0;
}

void regexp(AnsiString s, TStrings* sl, AnsiString sim)
{
int id = 1;
while(int n = regfind(s,sim)){
sl->Add(s.SubString(id,n-1));
s = s.SubString(n+1,s.Length()-1);
}
if(s.Length()) sl->Add(s);
}

void __fastcall TForm1::Button1Click(TObject *Sender)
{
regexp(Edit1->Text, ListBox1->Items, ";*+- ");
}
//------------------------


Отредактировано Admin — 02/12/2003, 00:15

Вернуться в Вопросы программирования в C++Builder