[C++] Explode?

Pagina: 1
Acties:

  • krietjur
  • Registratie: Februari 2001
  • Laatst online: 15:56

krietjur

Where am I?

Topicstarter
Ik wil in C++ een string splitsen zodat ik afzonderlijke woorden krijg. In php zou ik daarvoor dan explode() gebruiken, maar is er zoiets ook in C++? Ik heb al wel gevonden dat je met find() kunt kijken of een string als substring voorkomt in de string die ik wil doorzoeken en in combinatie met substr() kan ik denk ik ook wel iets maken dat doet wat ik hebben wil, maar het wiel opnieuw uitvinden is ook weer zo zinloos hè? :)

  • Grum
  • Registratie: Juni 2001
  • Niet online
Bestaan er geen tokenize functies ?

  • Birk
  • Registratie: Maart 2002
  • Laatst online: 15-02-2019
Op woensdag 10 april 2002 11:08 schreef krietjur het volgende:
Ik wil in C++ een string splitsen zodat ik afzonderlijke woorden krijg.
Procedure Schrijven die de string teken voor teken in leest en deze apart in een array zet. En als scheiding teken gebruik je de spatie...

Of er een comando is weet ik nie uit mijn hoofd, eff in de "help" zoeken...

Dyslexie | Linux | MoZilla | OpenOffice


  • Dash2in1
  • Registratie: November 2001
  • Laatst online: 31-08 22:49
char * strtok(char *str, const char *sep)

Of men hier dit goed c++ vindt is voor mij de vraag, maar goed.

Verwijderd

Je zult waarschijnlijk nog wat moeten aanpassen aangezien ik het voor eens specefiek doel geprogt heb.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
void explode(char * szString,
         char   cSeparator,
         char * szLeftpart,
         char * szRightpart)
{
    int iPos;
    char    *szResult;

    if (!strlen(szString)) 
    {
        szLeftpart[0] = 0;
        szRightpart[0] = 0;
        return;
    }

    szResult = strchr(szString, cSeparator);

    if (szResult == NULL)
    {
        szLeftpart[0] = 0;
        szRightpart[0] = 0;
        return;
    }

    iPos = szResult - szString;

    if (iPos == 0) 
    {
        szLeftpart[0] = 0;
    }
    else 
    {
        strncpy(szLeftpart, szString, iPos);
        szLeftpart[iPos] = 0;
    }

    if (iPos == (int)strlen(szString)) 
    {
        szRightpart[0] = 0;
    }
    else 
    {
        strncpy(szRightpart, szResult + 1, strlen(szResult) - 1);
        szRightpart[strlen(szResult) - 1] = 0;
    }
}

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 09-09 11:02
Doe 't alsjeblieft met strtok() en niet zoals Birk of GrAviTy voorstellen. Het is niet mijn opzet mensen te beledingen, maar met dergelijke code kun je gewoon NIET komen aanzetten.

Verder lijkt een efficiënte (maar nog steeds weinig zinnige) implementatie van GrAviTy's explode:
code:
1
2
3
4
5
6
7
void explode(const char *str, char sep, char *left, char *right)
{
  char *p=strchr(str,sep);
  if(!p) { *right=*left='\0'; return; }
  strncpy(left,str,p-str); *(left+(p-str))='\0';
  strcpy(right,p+1);
}

  • Birk
  • Registratie: Maart 2002
  • Laatst online: 15-02-2019
Op woensdag 10 april 2002 13:40 schreef Soultaker het volgende:
...maar met dergelijke code kun je gewoon NIET komen aanzetten.
Ligt eraan waar het voor gebruikt moet worden, maar idd strtok() is een betere oplossing...

Dyslexie | Linux | MoZilla | OpenOffice


Verwijderd

Mja als de explode de hele string in array's van strings moet splitsen op basis van een of meerdere character dan ben je beter af met een strtok. Maar als je een string in een linker en rechterdeel splitst gebruik je toch best strchr.

Verder vraag ik mij dan ook af waarom je (Soultaker) je voorbeeld uitwerkt met strchr als je zelf zegt dat je beter strtok kunt gebruiken.

Verwijderd

Ten eerste: Is het een char* of een std::string ?

Ten tweede: Heb je kopiën van de tokens nodig of zijn offset/length combo's (of iterators) ook goed ?

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 09-09 11:02
Op woensdag 10 april 2002 15:50 schreef GrAviTy het volgende:
Verder vraag ik mij dan ook af waarom je (Soultaker) je voorbeeld uitwerkt met strchr als je zelf zegt dat je beter strtok kunt gebruiken.
Ik wilde even demonstreren dat jou code heel wat compacter kon, zonder de werking te veranderen. Daarmee bedoelde ik niet dat de topicstarter 'm moest gebruiken. ;)

Een meer concrete suggestie kan ik alleen doen als ik meer gegevens heb over de beschikbare gegevens en het gewenste resultaat, zoals ook al door Sneechy werd vastgesteld.

Als je gewoon al je 'delen' een keer wil bekijken en je invoerstring verder niet constant is, kun je het volgende doen:
code:
1
2
3
4
5
6
7
8
9
10
11
  char
    *str, *pos, *pat="bla",    /* je patroon om op te splitsen */
  int
    patlen=strlen(pat); /* kan ook constant zijn natuurlijk */

  for(str=invoer;pos;str=pos+patlen)
  {
    if((pos=strstr(str,pat))) *pos='\0'; /* knip af */
    printf("[%s] ",str);    /* doe iets met stukje 'str' */
    str=(char*)(pos+patlen);  /* naar volgende stukje */
  }

  • krietjur
  • Registratie: Februari 2001
  • Laatst online: 15:56

krietjur

Where am I?

Topicstarter
Op woensdag 10 april 2002 16:23 schreef Sneechy het volgende:
Ten eerste: Is het een char* of een std::string ?

Ten tweede: Heb je kopiën van de tokens nodig of zijn offset/length combo's (of iterators) ook goed ?
1e: 't gaat om een AnsiString
2e: De bedoeling is een zin splitsen op de spaties, zodat je afzonderlijke woorden krijgt. Elk afzonderlijke woord moet dan z'n eigen plekje in een array krijgen.

In php is het dus dit:
code:
1
2
3
4
$pizza = "piece1 piece2 piece3 piece4 piece5 piece6";
$pieces = explode(" ", $pizza);

En dan is $pieces[0] = "piece1" etc.

Dat wil ik dus bereiken, alleen dan in C++

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 09-09 11:02
Hoe ziet je array er uit? Welk geheugen is al gealloceerd, mag naar de originele string verwezen worden, mag de originele string gewijzigd worden (spaties door nul-characters vervangen).

Verder zou je er zelf wel uit moeten kunnen komen lijkt me.

Verwijderd

Kon alles maar in PHP he ;)

  • Orphix
  • Registratie: Februari 2000
  • Niet online
Op woensdag 10 april 2002 23:14 schreef Tizzwat het volgende:
Kon alles maar in PHP he ;)
hehe :+

Maar ik ben het wel met je eens dat de string-handling in C++ weliswaar vrij krachtig en abstract is opgezet, maar daardoor vaak niet praktisch in het gebruik. Al helemaal niet voor een beginner.

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 09-09 00:49
code:
1
2
3
4
std::ostringstream oss( de_te_splitsen_string );

std::string woord;
while ( oss>>woord ) doe_met(woord);

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein

Pagina: 1