[C++] split functie

Pagina: 1
Acties:

  • pjonk
  • Registratie: November 2000
  • Laatst online: 29-12-2025
In Perl en PHP en zelfs in VB6 heb je de erg handige split functie. Nu wil ik in C++ ook de split functie gebruiken, maar dat is in ieder geval geen standaard functie.
Ik heb me doodgezocht naar een split functie voor C++, in de search en op MSDN enzo, maar heb helaas niets kunnen vinden?
Kan iemand mij op weg helpen :?

It’s nice to be important but it’s more important to be nice


  • marcusk
  • Registratie: Februari 2001
  • Laatst online: 26-09-2023
Kun je toch makkelijk zelf maken :? Gewoon de positie van de separator in de string bepalen, en dan de karakters ervoor in een nieuwe string kopieeren, enz.

  • pjonk
  • Registratie: November 2000
  • Laatst online: 29-12-2025
Op zondag 23 september 2001 17:39 schreef marcusk het volgende:
Kun je toch makkelijk zelf maken :? Gewoon de positie van de separator in de string bepalen, en dan de karakters ervoor in een nieuwe string kopieeren, enz.
Tja alles kan (koffie kan, thee kan :+)
Marruh lijkt mij nogal een vorm van opnieuw het wiel uitvinden. Als PHP en VB6 een split functie hebben zal C++ het toch zeker wel moeten hebben denk :?

It’s nice to be important but it’s more important to be nice


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 21-09 12:16

.oisyn

Moderator Devschuur®

Demotivational Speaker

TADAAAAAAAAAAAAA: strtok ()

:+

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

classdef:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// purpose: string splitter class. Will split string using delimiter in separate CString objects.
class CStringSplitter
{
public:
    CStringSplitter();
    virtual ~CStringSplitter();

    void        Clear(void);
    void        DoSplit(LPCTSTR csStringToSplit, TCHAR cDelimiter);
    long        GetAmountOfFragments(void);

public:
    CArray<CString, CString>    m_arrcsSplittedFragments;
    long        m_lAmountOfFragments;
};

class code:
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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
CStringSplitter::CStringSplitter()
{
    m_lAmountOfFragments=0;
}

CStringSplitter::~CStringSplitter()
{
    Clear();
}

void
CStringSplitter::Clear()
{
    // Free the amount of CString splitter fragments.
    m_arrcsSplittedFragments.RemoveAll();
}


void
CStringSplitter::DoSplit(LPCTSTR csStringToSplit, TCHAR cDelimiter)
{
    CString     csTmp=csStringToSplit;

    for(long lIndx=0, m_lAmountOfFragments=1;;)
    {
        lIndx = csTmp.Find(cDelimiter,lIndx);
        if(lIndx>=0)
        {
            m_lAmountOfFragments++;
            lIndx++;
        }
        else
        {
            // not found, end search
            break;
        }
    }

    // Allocate string fragments
    m_arrcsSplittedFragments.SetSize(m_lAmountOfFragments, 1);

    if(m_lAmountOfFragments>1)
    {
        // we have to split the string at least once. lPrevIndx points to
        // first character after last delimiter found. lIndx points to current
        // position of delimiter
        for(long lIndx=0, lPrevIndx=0, i=0;i<m_lAmountOfFragments;i++)
        {
            // get delimiter position
            lIndx = csTmp.Find(cDelimiter,lPrevIndx);
            if(lIndx>=0)
            {
                // found. Copy string between lPrevIndx and lIndx into array element.
                m_arrcsSplittedFragments[i]=csTmp.Mid(lPrevIndx,(lIndx-lPrevIndx));
                m_arrcsSplittedFragments[i].TrimLeft();
                m_arrcsSplittedFragments[i].TrimRight();
                lPrevIndx=lIndx+1;
                lIndx++;
            }
            else
            {
                // not found, copy the last bit of the string into the last arrayelement.
                m_arrcsSplittedFragments[i]=csTmp.Mid(lPrevIndx,(csTmp.GetLength()-lPrevIndx));
            }
        }
    }
    else
    {
        // just copy the entire string which had to be split into the first
        // array element.
        m_arrcsSplittedFragments[0]=csStringToSplit;
    }
}

(Inderdaad, MFC :P)

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 20-09 16:35
Volgens mij is er in de STL wel een split functie of iets met vergelijkbare functionaliteit...

Hmmm...niet direct een split, maar je hebt wel een std::string.find(...) en ook een std::string.copy(...), daar kun je vast wat mee.

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 04-09 14:38

curry684

left part of the evil twins

Op zondag 23 september 2001 17:39 schreef marcusk het volgende:
Kun je toch makkelijk zelf maken :? Gewoon de positie van de separator in de string bepalen, en dan de karakters ervoor in een nieuwe string kopieeren, enz.
Of een simpel tokenizertje in mekaar kloppen:
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
class Tokenizer
{
public:
  Tokenizer(char* p_String, bool p_Copy = true)
    {
    if(p_Copy)
    {
    m_Buffer     = new char[strlen(p_String) + 1];
    strcpy(m_Buffer, p_String);
    }
    else
    m_Buffer     = p_String;

    m_Current    = m_Buffer;
    }

  virtual ~Tokenizer();
    {
    delete [] m_Buffer;
    }

  bool GetNextToken(char p_Delimiter, 
              char* p_Buffer, int p_BufferSize)
    {
    char*   m_Position = strchr(m_Current, p_Delimiter);
    if(!m_Position || m_Position - m_Current > p_BufferSize)
    return false;
    strncpy(p_Buffer, m_Current, (m_Position - m_Current) / sizeof(char));
    m_Current = m_Position;
    return true;
    }

private:
  char*      m_Buffer;
  char*      m_Current;
};

Even compleet uit het blote hoofd terwijl ik op een compile zit te wachten, oftewel GEEN GARANTIES dat het werkt of uberhaupt compileert... :7

Professionele website nodig?


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 21-09 12:16

.oisyn

Moderator Devschuur®

Demotivational Speaker

is er dan niemand die naar mij luisterd? :? :)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

Topicstarter: bedoel je een std::string, of een null-terminated char array dingsel ?

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 20-09 16:35
Op maandag 24 september 2001 18:58 schreef OiSyN het volgende:
is er dan niemand die naar mij luisterd? :? :)
is ook geen _echte_ c++ toch? ;)

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


Verwijderd

Op maandag 24 september 2001 18:58 schreef OiSyN het volgende:
is er dan niemand die naar mij luisterd? :? :)
Dat ten eerste niet nee ;)

Maar hij vroeg expliciet om een split functie, en bv in VB en VBScript heb je een splitfunctie die een array van strings oplevert (de code die ik gaf). strtok geeft een charpointer terug naar het volgende token, daarmee moet je dus nog zelf copieren en plakken. :)

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 04-09 14:38

curry684

left part of the evil twins

Op maandag 24 september 2001 18:58 schreef OiSyN het volgende:
is er dan niemand die naar mij luisterd? :? :)
Zei iemand wat? :?

:7

Professionele website nodig?


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 21-09 12:16

.oisyn

Moderator Devschuur®

Demotivational Speaker

Op dinsdag 25 september 2001 09:36 schreef Otis het volgende:

[..]

Dat ten eerste niet nee ;)
grrrrr ;)
Maar hij vroeg expliciet om een split functie, en bv in VB en VBScript heb je een splitfunctie die een array van strings oplevert (de code die ik gaf). strtok geeft een charpointer terug naar het volgende token, daarmee moet je dus nog zelf copieren en plakken. :)
ja eeh als ie overal kant en klare functies voor wilt hebben dan moet ie niet C++ gaan programmeren :)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 21-09 12:16

.oisyn

Moderator Devschuur®

Demotivational Speaker

Op dinsdag 25 september 2001 08:42 schreef farlane het volgende:

[..]

is ook geen _echte_ c++ toch? ;)
oh en waar staat dan dat ie persee echte (dat doe je dus met de underscore tags: [ u] ... [/ u] (zonder spaties) :P)) c++ functies wilt hebben? Waarschijnlijk gebruikt ie ook gewoon char arrays, en dus niet std::string

En als ie dat wel bedoelt: okee, dan heb ik niets gezegd en zal ik mijn ongelijk ook gewoon willen toegeven :)

Dusseeeh JonkieXL (is dat niet met een u? :P), gebruik je nou std::string of gewoon een char array? :)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 21-09 12:16

.oisyn

Moderator Devschuur®

Demotivational Speaker

Op dinsdag 25 september 2001 13:22 schreef curry684 het volgende:

[..]

Zei iemand wat? :?

:7
en laten we het maar niet over jouw pointer tiepfout van laatst gaan hebben 8-)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 04-09 14:38

curry684

left part of the evil twins

Op dinsdag 25 september 2001 16:34 schreef OiSyN het volgende:
en laten we het maar niet over jouw pointer tiepfout van laatst gaan hebben 8-)
Ik had gewoon copy-paste gedaan en alleen die sterretjes verwijderd okee? :7

* curry684 wins the Lazy Fuck of the Year award again B-)

Professionele website nodig?


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 21-09 12:16

.oisyn

Moderator Devschuur®

Demotivational Speaker

nou voor iemand die eerst "C++ vraagbaak" in z'n ondertitel had staan vind ik dat een niet erg representatieve manier :)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 04-09 14:38

curry684

left part of the evil twins

Het verantwoord kunnen kiezen tussen functionaliteit binnen-aggregreren, binnen-inheriten, of botweg copy-pasten is anders best een gevorderd topic voor veel mensen hoor... :P

Professionele website nodig?


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 21-09 12:16

.oisyn

Moderator Devschuur®

Demotivational Speaker

op een een of andere manier doet me dat denken aan

You know you're game is in trouble when... every 5 minutes you search your book shelf to look for a book named "how to program <the name of your game>", with full source code included

:)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 20-09 16:35
He Jonkie ;) ,

Ben je een echte c++ man of zo'n low-level procedurele c freubelaar die elke keer weer zijn eigen linked-list maakt en van STL nog nooit heeft gehoord en om die reden voortdurend zijn eigen nul pointers en array-boundary violations om zun oren krijgt? (hmmm......ik herken vaag enige punten in de lijst....naja *D )

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


Verwijderd

Op dinsdag 25 september 2001 20:42 schreef farlane het volgende:
Ben je een echte c++ man of zo'n low-level procedurele c freubelaar die elke keer weer zijn eigen linked-list maakt en van STL nog nooit heeft gehoord en om die reden voortdurend zijn eigen nul pointers en array-boundary violations om zun oren krijgt? (hmmm......ik herken vaag enige punten in de lijst....naja *D )
Zeg es, wanneer heb jij voor het laatst gets() of strcpy() gebruikt? :P

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 21-09 12:16

.oisyn

Moderator Devschuur®

Demotivational Speaker

oepsie :D

* schaam *

(voor degenen die geinsteresseerd zijn in wat hier stond, ik heb het nog in mijn clipboard staan :))

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • marcusk
  • Registratie: Februari 2001
  • Laatst online: 26-09-2023
Op dinsdag 25 september 2001 23:03 schreef OiSyN het volgende:
[]
...
Volgens mij had ie het tegen de topicstarter hoor :D

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 21-09 12:16

.oisyn

Moderator Devschuur®

Demotivational Speaker

Op dinsdag 25 september 2001 23:15 schreef marcusk het volgende:

[..]

Volgens mij had ie het tegen de topicstarter hoor :D
:D

Zou kunnen ja, maar ik zat te zeuren over strtok () (duidelijk een c-functie), en dat niemand naar me zat te luisteren en allemaal C++ oplossingen postten... :) Maar nu je het zegt, jonkie slaat idd vast op JonkieXL :)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • The - DDD
  • Registratie: Januari 2000
  • Laatst online: 03-09 16:40
Gewoon zelf even eits in elkaar draaien.
Misschien dat de STL klasse string hier handig bij is.

Een string terug geven als een array van sub-strings is niet zo moeilijk. Vooral een kwestie van niet vergeten '\0' erachter te zetten, mits je met C-strings werkt.

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 20-09 16:35
Volgens mij heb ik het 1 en ander gemist :)

En idd, ik had het tegen de topicstarter toen ik over Jonkie sprak ...

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.

Pagina: 1