Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Podela AnsiString-a?

[es] :: C/C++ programiranje :: Podela AnsiString-a?

[ Pregleda: 2631 | Odgovora: 6 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

n1kola
Skola :D
Beograd

Član broj: 100829
Poruke: 24
*.BVCOM.NET.



Profil

icon Podela AnsiString-a?08.07.2006. u 23:09 - pre 216 meseci
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.
 
Odgovor na temu

X Files
Vladimir Stefanovic
Pozarevac

SuperModerator
Član broj: 15100
Poruke: 4902
*.nat-pool.po.sbb.co.yu.

Jabber: xfiles@elitesecurity.org


+638 Profil

icon Re: Podela AnsiString-a?09.07.2006. u 08:49 - pre 216 meseci
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

 
Odgovor na temu

NrmMyth
Ivan Maček
Split

Član broj: 63456
Poruke: 849
*.cmu.carnet.hr.

Sajt: www.dump.hr


Profil

icon Re: Podela AnsiString-a?09.07.2006. u 12:18 - pre 216 meseci
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;
}
 
Odgovor na temu

n1kola
Skola :D
Beograd

Član broj: 100829
Poruke: 24
*.BVCOM.NET.



Profil

icon Re: Podela AnsiString-a?09.07.2006. u 17:33 - pre 216 meseci
Hvala vam obojici, ubih se trazeci po google-u, ali bas nista nisam uspeo da nadjem :)

Pozdrav.
 
Odgovor na temu

n1kola
Skola :D
Beograd

Član broj: 100829
Poruke: 24
*.BVCOM.NET.



Profil

icon Re: Podela AnsiString-a?10.07.2006. u 18:35 - pre 216 meseci
X Files pogledao sam onaj link sto si mi dao, ali mi ne radi funkcija ParseAnsiStringToStrings. Imam BCB6. Jel imas ideju zasto? :/
 
Odgovor na temu

X Files
Vladimir Stefanovic
Pozarevac

SuperModerator
Član broj: 15100
Poruke: 4902
*.nat-pool.po.sbb.co.yu.

Jabber: xfiles@elitesecurity.org


+638 Profil

icon Re: Podela AnsiString-a?10.07.2006. u 19:29 - pre 216 meseci
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.


 
Odgovor na temu

NrmMyth
Ivan Maček
Split

Član broj: 63456
Poruke: 849
*.cmu.carnet.hr.

Sajt: www.dump.hr


Profil

icon Re: Podela AnsiString-a?11.07.2006. u 00:33 - pre 216 meseci
Sta ti je, nikola, stvarno tesko prepraviti STL u BCL...?!
 
Odgovor na temu

[es] :: C/C++ programiranje :: Podela AnsiString-a?

[ Pregleda: 2631 | Odgovora: 6 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.