Kirjoittaja Aihe: [ ratkaistu ] c++ char-merkkijon sanat vector<std::sring> -muotoon  (Luettu 2387 kertaa)

teele

  • Käyttäjä
  • Viestejä: 815
    • Profiili
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;
  }
« Viimeksi muokattu: 10.10.22 - klo:21.45 kirjoittanut teele »

nm

  • Käyttäjä
  • Viestejä: 16242
    • Profiili
Vs: c++ char-merkkijon sanat vector<std::sring> -muotoon
« Vastaus #1 : 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.

teele

  • Käyttäjä
  • Viestejä: 815
    • Profiili
Vs: c++ char-merkkijon sanat vector<std::sring> -muotoon
« Vastaus #2 : 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.

nm

  • Käyttäjä
  • Viestejä: 16242
    • Profiili
Vs: c++ char-merkkijon sanat vector<std::sring> -muotoon
« Vastaus #3 : 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.

teele

  • Käyttäjä
  • Viestejä: 815
    • Profiili
Vs: c++ char-merkkijon sanat vector<std::sring> -muotoon
« Vastaus #4 : 10.10.22 - klo:21.44 »

Hyvät neuvot, kiitos :)