Ubuntu Suomen keskustelualueet

Ubuntun käyttö => Ohjelmointi, palvelimet ja muu edistyneempi käyttö => Aiheen aloitti: teele - 07.10.22 - klo:21.15

Otsikko: [ ratkaistu ] c++ char-merkkijon sanat vector<std::sring> -muotoon
Kirjoitti: teele - 07.10.22 - klo:21.15
Muotoa

"kirja istuin eläin maantie eilinen syksy"

oleva merkkijono pitäisi saada vector<std::string> muotoon

vec{ "kirja", "eläin", "maantie", "eilinen", "syksy"}

Olen kokeillut
Koodia: [Valitse]
  std::vector<std::string> str_to_vec(char* c)
  {
    std::vector<std::string> vec;
    char *token;
    char *rest = c;
 
    while((token = strtok_r(rest, " ", &rest)))
    {
      vec.push_back(std::string(trim(token)));
    }
    return vec;
  }

Mutta se näyttää vaikutavan alkuperäiseen parametrina tulevaan merkkijonoon :(

Netistä ei oikein löydy hyvää eaimerkkiä strtok-funktiosta tai sitten kukaan ei välitä, mitä alkuperäiselle merkkijonolle tapahtuu?

Voisiko tässä kutsussa olevan *c parametrin jotenkin korvata niin, että strtok ei pääsisi käsiksi alkuperäiseen merkkijonoon niin, että merkkijono muuttuu? Tai olisiko joku muu tapa saada välilyönnein erotellut sanat char-merkkijonosta sanavektoriksi.


Muokk.

En millään saanut strtok -funktiota selvitetyksi. Vaihtoehtona yritin seuraavaa, toivottavasti siinä ei ole mitään ikäviä yllätyksiä tai liikaa hitautta verrattuna valmiiseen funktioon.


Koodia: [Valitse]
  std::vector<std::string> str_to_vec(char* cptr)
  {
    std::vector<std::string> vec;
    std::string tok = "";
         
    while( *cptr != '\0')
    {
      if(*cptr == ' ' && tok != "")
      {
        vec.push_back(trim(tok));
        tok = "";
        cptr ++;
        continue;
      }
      else
      {
        tok += *cptr;
        cptr++;
        if( *cptr == '\0')
        {
          vec.push_back(trim(tok));
        }
      }     
    }     
    return vec;
  }
Otsikko: Vs: c++ char-merkkijon sanat vector<std::sring> -muotoon
Kirjoitti: nm - 08.10.22 - klo:23.18
Voisiko tässä kutsussa olevan *c parametrin jotenkin korvata niin, että strtok ei pääsisi käsiksi alkuperäiseen merkkijonoon niin, että merkkijono muuttuu?

Jos välttämättä pitäisi käyttää strtokia, ja muuttuminen on ongelma, merkkijonosta pitäisi tehdä väliaikainen kopio.

Tai olisiko joku muu tapa saada välilyönnein erotellut sanat char-merkkijonosta sanavektoriksi.

Tässä varsin tyhjentävä esitys vaihtoehdoista:
https://cplusplus.com/faq/sequences/strings/split/

std::getline riittänee tässä tapauksessa, kun välimerkkejä on vain yksi.
Otsikko: Vs: c++ char-merkkijon sanat vector<std::sring> -muotoon
Kirjoitti: teele - 09.10.22 - klo:21.33


getline näyttäisi kätevältä, mutta jossain netissä on kirjoitettu, että stringstreamin tekeminen merkkijonosta ja sen luku ja käsittely olisivat raskaita työvaiheita. Mutta onko tässä oikeasti perää, onko järkevää yrittää välttää merkkijonon käsittelmistä vuona, jos tarkoituksena on laittaa ne saadut sanat stl-säiliöön.
Otsikko: Vs: c++ char-merkkijon sanat vector<std::sring> -muotoon
Kirjoitti: nm - 10.10.22 - klo:10.01
getline näyttäisi kätevältä, mutta jossain netissä on kirjoitettu, että stringstreamin tekeminen merkkijonosta ja sen luku ja käsittely olisivat raskaita työvaiheita.

No tuolla voi olla käytännön merkitystä sitten, jos käsittelet mega- tai gigatavujen kokoisia merkkijonoja.

Seuraavana vaihtoehtona olisi suoraan stringiä lukeva string::find_first_of(). Esimerkkinä valmis ratkaisu ongelmaasi.
Otsikko: Vs: c++ char-merkkijon sanat vector<std::sring> -muotoon
Kirjoitti: teele - 10.10.22 - klo:21.44

Hyvät neuvot, kiitos :)