Gå til innhold

Stringfunksjonar i C++?


Anbefalte innlegg

Skrevet

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.

Videoannonse
Annonse
Skrevet (endret)

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.
Skrevet

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?

Skrevet (endret)

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
Skrevet (endret)
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
Skrevet

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.

Skrevet

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.

Skrevet

Var forresten en liten bug i koden min, skal se slik ut:

 s.substr(b, e - b);

Det siste argumentet (e - b) skal være antall tegn ikke posisjon.

Skrevet (endret)
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
Skrevet

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.

Skrevet (endret)
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

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...