Gå til innhold

Stringfunksjonar i C++?


Anbefalte innlegg

Hallo!

 

Etter å ha lese ut ei bok, har eg begynt å forstå C++ mykje meir, men det er ein ting som begrensar meg enormt. Ettersom det ofte er lite vits å lage program som ikkje har muligheit til å lagre informasjon mellom kvar gong det køyrar, må eg lagre mykje i filer. Det er her problemet mitt er. Eg må jo kunne "få ut" den informasjonen eg treng, enkelt, frå fila. Eg har ikkje funne ein einaste string-funksjon i C++ som kan minne om dei som det finnes utallige av i PHP. Eksempel på kva som finnes i PHP, som eg hadde likt å hatt her er:

 

str_replace(); (!)

strlen();

substr();

explode(); (!)

implode();

preg_match();

preg_replace (!)

 

No reknar eg ikkje med at eg kom på alt i farten, men finnes det (gjerne eit standard) bibliotek som har nokre liknande funksjonar? Og ein ting til. Kunne nokon vist eit eksempel på korleis det går ann å lage ein heimelaga funksjon som gjer jobben til f.eks. explode? (dele opp ein string ved eit valgfritt teikn/streng f.eks. ! og lage eit nytt "ledd" i ein array, eller vector, for kvar del) Eg hadde likt å fått litt inspirasjon til korleis ein kan "gå inn" og "jobbe" med stringar.

Lenke til kommentar
Videoannonse
Annonse

Sånn fort ut av hodet har du iallfall size() (i stringklassen) som erstattning for strlen();

Ellers er et godt tips å sjekke hva string-klassen faktisk inneholder av funksjoner. Det er svært mange skal jeg si deg ;)

 

Edit: må bare friske opp PHP-kunnskapene litt så kanskje jeg kommer med flere til deg ;)

Endret av Ernie.
Lenke til kommentar

Hmm. Kom forresten bare ikkje på at string hadde size(), men det har han jo. Dersom lista som Kjeksen her viser er fullstendig, var det ikkje meir enn substr() som virka nyttig for meg.

 

Finnes det ikkje ein einaste funksjon for å køyre regular expression?

Lenke til kommentar

Kanskje Boost biblioteket er et alternativ:

Boost.org

 

http://www.boost.org/doc/html/string_algo.html

http://www.boost.org/libs/regex/doc/index.html

 

Har ikke brukt disse to til nå, men bruker andre deler av biblioteket jevnlig (conversion/lexical_cast). Templates er mye brukt, så koden kan bli litt uoversiktlig hvis en ikke har mye erfaring med dette.

Endret av hishadow
Lenke til kommentar

Hmm. Ja, kan jo sjå på det der, men er det ikkje litt teit at dette ikkje finnes i standard C++?

 

Og for det andre. Det er ikkje nokon som gidder å vise litt _enkel_ behandling av ein streng. F.eks. hente ut alt mellom første "h" og første "i" i denne: "Hallo! Til deg ;)"? Då tenkjer eg ikkje med ein eigen funksjon, men bare med, ja, kva det no er som må brukast for å "spasere gjennom" stringen og hente ut det viktige.

Endret av knuto
Lenke til kommentar
Hmm. Ja, kan jo sjå på det der, men er det ikkje litt teit at dette ikkje finnes i standard C++?
C++ har nok sine mangler, bare størrelsen på Boost sier sitt. Men sånn er det nå en gang :shrug:

 

Og for det andre. Det er ikkje nokon som gidder å vise litt _enkel_ behandling av ein streng. F.eks. hente ut alt mellom første "h" og første "i" i denne: "Hallo! Til deg ;)"? Då tenkjer eg ikkje med ein eigen funksjon, men bare med, ja, kva det no er som må brukast for å "spasere gjennom" stringen og hente ut det viktige.
Jeg pleier ikke å gjøre noe særlig strengbehandling i C++, så jeg husker ikke noen enkel måte å gjøre det case-insensitivt, men selve søket bør være enkelt:

string s = "Hallo! Til deg";
string::size_type b(s.find_first_of("H")), e(s.find_first_of("i") + 1);
string str = s.substr(b, e - b);    // 'H' til og med 'i'

 

Én måte å gjøre det case-insensitivt kunne være std::find med egen kode for selve sammenligningen.

Endret av A_N_K
Lenke til kommentar

Hmm. Det var jo ei orginal løysing. Faktisg ganske grei.

 

Det er ingen som har lyst å løyse ei anna oppgåve då? Nemleg å konvertere denne fila til to array'ar der ein har dei norske orda, og den andre har dei engelske?

sau

sheep

 

hus

house

 

gard

farm

 

Noreg

Norway

 

glad

happy

Som de kanskje ser har eg lyst å utvikle eit gloseprogram, ettersom eg endå ikkje har funne eit som eg er fornøgd med. Den overnemnte oppstillinga er ganske brukarvennleg etter mi meining.

 

Omtrent noko slikt:

norwegian = array(
   0 => 'sau',
   1 => 'hus',
   2 => 'gard',
   3 => 'Noreg',
   4 => 'glad'
);
english = array(
   0 => 'sheep',
   1 => 'house',
   2 => 'farm',
   3 => 'Norway',
   4 => 'happy'
);

Eller dersom dette er ein ting som ikkje egnar seg til arrays, kan det jo brukast to vectors.

Lenke til kommentar

Explode alternativ...

 

void Tokenize(const string& str, vector<string>& tokens, const string& delimiters = " ")

{

    // Skip delimiters at beginning.

    string::size_type lastPos = str.find_first_not_of(delimiters, 0);

    // Find first "non-delimiter".

    string::size_type pos    = str.find_first_of(delimiters, lastPos);

 

    while (string::npos != pos || string::npos != lastPos)

    {

        // Found a token, add it to the vector.

        tokens.push_back(str.substr(lastPos, pos - lastPos));

        // Skip delimiters.  Note the "not_of"

        lastPos = str.find_first_not_of(delimiters, pos);

        // Find next "non-delimiter"

        pos = str.find_first_of(delimiters, lastPos);

    }

}

 

Referanse.

Lenke til kommentar
Det er ingen som har lyst å løyse ei anna oppgåve då? Nemleg å konvertere denne fila til to array'ar der ein har dei norske orda, og den andre har dei engelske?

 

// Les inn all data i en lang string.

string data = LesFraFil();

 

// Overfør ordene i data strengen til en tabell.

vector<string> words;

Tokenize(data, words, " \n")

 

// Hvert ord kan nå aksesseres fra tabellen. Ord nr.(i) = norsk og

//  nr.(i+1) = engelsk ord

 

 

Videre kan du beregne tallverdier ut av hvert norske ord. Disse tallverdiene kan legges til et binært søketre. Sammen med tallverdien lagres også indeksen til ordets posisjon i tabellen. Dette gjentas for de engelske ordene, men lagres i et nytt binært søketre.

 

Når dette er klart gjør du følgende når du vil lete opp et ord på norsk til engelsk:

1. Beregn tallverdi av ordet.

2. Slå opp tallverdien i det binære søketreet for norske ord.

3. Bruk (indeksverdien + 1) du finner her til å slå opp i tabellen (gitt at ordet finnes i søket).

 

Når dette er klart gjør du følgende når du vil lete opp et ord på engelsk til norsk:

1. Beregn tallverdi av ordet.

2. Slå opp tallverdien i det binære søketreet for engelske ord.

3. Bruk (indeksverdien - 1) du finner her til å slå opp i tabellen (gitt at ordet finnes i søket).

Endret av hishadow
Lenke til kommentar
Tusen takk! Mykje nyttig her. Sjølv om eg sikkert ikkje kjem til å bruke alt som du viste i eksempelet, ser eg jo fint korleis du klarer å gjere oppgåva.

Som du ser. Null problem å lage softwaren... problemet er å skaffe en ordentlig datakilde.

 

Bruker Clue istedet.

 

Edit:

Som du ser så koster programmet flesk for alle unntatt studenter. Kanskje litt konkurranse hadde gjort seg. Det er iallefall et marked for dette ;)

Endret av hishadow
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...