[ n1kola @ 08.07.2006. 23:09 ] @
Recimo da imamo AnsiString "Dobar dan". Kako ja da podelim taj AnsiString na 2 AnsiStringa, str1, koji bi bio "Dobar", i drugi, str2, koji bi bio "dan" ? Znaci, podela po razmacima. Pozdrav. |
[ n1kola @ 08.07.2006. 23:09 ] @
[ X Files @ 09.07.2006. 08:49 ] @
Prvo moras da smislis u kom obliku zelis rezultat, tj. gde ces smestiti ta dva (ili vise!)
stringova koji su razdvojeni nekim znakom (u tvom) slucaju blankom. Sve se uglavnom resava metodama AnsiString klase: Length() - duzina stringa Pos() - pozicija nekog znaka SubString() - podstring ... pa ako se radi samo o dva elementa, onda moze neko ovakvo resenje: Code: void __fastcall TForm1::Button1Click(TObject *Sender) { AnsiString NekiString = "prvi drugi"; AnsiString Prvi; AnsiString Drugi; int Razdvajac = NekiString.Pos( ' ' ); if ( Razdvajac > 0 ) { Prvi = NekiString.SubString( 1, Razdvajac ); Drugi = NekiString.SubString( Razdvajac+1, NekiString.Length() ); } ShowMessage( Prvi ); ShowMessage( Drugi ); } Medjutim ako zelis neko genericko resenje, koje ce ti izdvojiti sve elemente odvojene nekim znakom, onda pogledaj ovde: http://tinyurl.com/fcly8 [ NrmMyth @ 09.07.2006. 12:18 ] @
Obicno ne pisem kodov, ali neka ti.
U O(N)... Funkcija... Code: vector<string> ssplit( string s, bool (*cmp)( char x ) ) { s += ' '; vector<string> vv; bool src = false; string ts; for( int i = 0; i < s.length(); ++i ) { if( cmp( s[i] ) ) { ts += s[i]; src = true; } else if( src ) { src = false; vv.push_back( ts ); ts.clear(); } } return vv; }; ...prima parametar funcije koja vraca true ako znak iz stringa moze biti dio rijeci... Primjer te funkcije... Code: bool comp( char x ) { return isalnum( x ); }; ... kao wraper za isalnum(). Probaj Code: int main( void ) { char cc[128]; string s = gets( cc ); vector<string> vv = ssplit( s, comp ); for( int i = 0; i < vv.size(); ++i ) printf( "word %d. :\t\t %s\n", i, vv[i].c_str() ); system( "pause" ); return 0; } [ n1kola @ 09.07.2006. 17:33 ] @
Hvala vam obojici, ubih se trazeci po google-u, ali bas nista nisam uspeo da nadjem :)
Pozdrav. [ n1kola @ 10.07.2006. 18:35 ] @
X Files pogledao sam onaj link sto si mi dao, ali mi ne radi funkcija ParseAnsiStringToStrings. Imam BCB6. Jel imas ideju zasto? :/
[ X Files @ 10.07.2006. 19:29 ] @
Kod mene sve radi. Verovatno si prevideo BLANKO i znak DVE TACKE, jer je inicijalno resenje
radjeno za slucaj kada se razdvajanje vrsi na poojavu znaka DVE TACKE. Evo ti kod: --- H --- Code: void ParseAnsiStringToStrings( AnsiString AString, char AChar, TStrings *AStrings ); AnsiString StringsToAnsiString( TStrings *AStrings, char AChar ); --- CPP --- Code: void TForm1::ParseAnsiStringToStrings( AnsiString AString, char AChar, TStrings *AStrings ) { if ( AString.Length() == 0 ) return; AString = AString + AChar; AStrings->Clear(); char *niz = new char[ AString.Length() + 1 ]; char *pom = new char[ AString.Length() + 1 ]; strcpy( niz, AString.c_str() ); int prev = 0; for ( int i=0; i<AString.Length(); i++ ) { if ( ( niz[i] == AChar ) || ( i == AString.Length()-1 ) ) { strncpy( pom, &niz[prev], i-prev ); pom[i-prev] = '\0'; if ( AnsiString( pom ).Length() > 0 ) // <--- if NULL do nothing AStrings->Add( AnsiString( pom ) ); prev = i + 1; } } delete [] pom; delete [] niz; } AnsiString TForm1::StringsToAnsiString( TStrings *AStrings, char AChar ) { AnsiString Delimited; for ( int i=0; i<AStrings->Count; i++ ) Delimited += AStrings->Strings[i] + AChar; Delimited.SetLength( Delimited.Length()-1 ); return( Delimited ); } void __fastcall TForm1::Button1Click(TObject *Sender) { ParseAnsiStringToStrings( Edit1->Text, ' ', ListBox1->Items ); } void __fastcall TForm1::Button2Click(TObject *Sender) { Edit2->Text = StringsToAnsiString( ListBox1->Items, ' ' ); } Dakle, stavi na formu: Edit1 (neka ima vrednost: a b c d e) Edit2 ListBox1 Button1 Button2 Kada pritisnes Button1, vrsi se provera onoga sto pise u Edit1 i rezultat se stavlja u ListBox1. Pritisak na Button2 vrsi obrnut postupak i sadrzaj ListBox1 stavlja u Edit2. Inace, resenje je poprilicno rogobatno, jer sam ga radio cisto da proradi. Imas postovana kraca i elegantnija resenja. [ NrmMyth @ 11.07.2006. 00:33 ] @
Sta ti je, nikola, stvarno tesko prepraviti STL u BCL...?!
Copyright (C) 2001-2025 by www.elitesecurity.org. All rights reserved.
|