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è?
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...Op woensdag 10 april 2002 11:08 schreef krietjur het volgende:
Ik wil in C++ een string splitsen zodat ik afzonderlijke woorden krijg.
Of er een comando is weet ik nie uit mijn hoofd, eff in de "help" zoeken...
Dyslexie | Linux | MoZilla | OpenOffice
char * strtok(char *str, const char *sep)
Of men hier dit goed c++ vindt is voor mij de vraag, maar goed.
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;
}
} |
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:
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);
} |
Ligt eraan waar het voor gebruikt moet worden, maar idd strtok() is een betere oplossing...Op woensdag 10 april 2002 13:40 schreef Soultaker het volgende:
...maar met dergelijke code kun je gewoon NIET komen aanzetten.
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.
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 ?
Ten tweede: Heb je kopiën van de tokens nodig of zijn offset/length combo's (of iterators) ook goed ?
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.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.
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 */
} |
1e: 't gaat om een AnsiStringOp 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 ?
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++
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.
Verder zou je er zelf wel uit moeten kunnen komen lijkt me.
heheOp woensdag 10 april 2002 23:14 schreef Tizzwat het volgende:
Kon alles maar in PHP he
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.
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