Avatar billede kjeldsted Novice
21. januar 2009 - 18:26 Der er 5 kommentarer og
1 løsning

Splitte string til array i C++ Hvordan?

Hej eksperter.

Efter et par år med PHP programmering har jeg nu valgt at forsøge at kaste mig over C++ og er altså derfor HELT ny inden for dette sprog.

Jeg vil så spørge om hvordan jeg vil kunne splitte en streng op til arrays. Strengen kan se sådan ud (00:02:30:00). Den indeholder dog ALTID to tal et kolon, to tal, et kolon og sådan indtil der er 4*2 tal.

Jeg ved at PHP vil kunne dette med explode(). Findes der en ligende C++ funktion?

På forhånd tak.
Avatar billede bertelbrander Novice
21. januar 2009 - 19:32 #1
I C++ har man meget sjældent den slags funktioner indbygget, da man forholdsvis let kan bygge dem med andre og mere generiske funktioner.
Jeg har skrevet lidt om det her:
http://damb.dk/strsplit.php
Avatar billede kjeldsted Novice
21. januar 2009 - 19:49 #2
Mange tak :D Lige det jeg manglede.

Der er dog noget jeg godt kunne tænke mig at sprøge om, så jeg evt. også kunne lære lidt af det ;)

Sidst i din kode skriver du:

std::cout << "[" << S << "]" << std::endl;

Hvilket umiddelbart ser ud til at have samme funktion som:

cout << "[" << S << "]" << endl;

Hvorfor kommer disse std:: før hhv. cout og endl?
Avatar billede kjeldsted Novice
21. januar 2009 - 19:50 #3
Desuden, smid et svar hvis du vil have points...
Avatar billede arne_v Ekspert
21. januar 2009 - 19:51 #4
Jeg har nogle eksempler liggende paa lageret.

C:

#include <stdio.h>
#include <string.h>

#define MAX_ELM 25
#define MAX_LEN 25

int split(char buf[MAX_ELM][MAX_LEN],char sep,char *s)
{
    int res,ix,i;
    res = 0;
    ix = 0;
    for(i=0;i<strlen(s);i++)
    {
        if(s[i]==sep)
        {
            if(ix>0)
            {
                buf[res][ix] = '\0';
                res++;
                ix = 0;
            }
        }
        else
        {
            buf[res][ix] = s[i];
            ix++;
        }
    }
    if(ix>0)
    {
        buf[res][ix] = '\0';
        res++;
    }
    return res;
}

int main()
{
    int n,i;
    char buf[MAX_ELM][MAX_LEN];
    n = split(buf,' ',"a bb ccc  dddd");
    for(i=0;i<n;i++)
    {
        printf("%s\n",buf[i]);
    }
    return 0;
}

C++:

#include <iostream>
#include <vector>
#include <string>

using namespace std;

vector<string> split(char sep,string s)
{
    vector<string> res;
    string tmp = "";
    for(int i=0;i<s.size();i++)
    {
        if(s[i]==sep)
        {
            if(tmp.size()>0)
            {
                res.push_back(tmp);
                tmp = "";
            }
        }
        else
        {
            tmp = tmp + s[i];
        }
    }
    if(tmp.size()>0)
    {
        res.push_back(tmp);
    }
    return res;
}

int main()
{
    vector<string> res = split(' ',"a bb ccc  dddd");
    for(int i=0;i<res.size();i++)
    {
        cout << res[i] << endl;
    }
    return 0;
}

Man kan ogsaa bruge regex i C/C++.

Eksempel i C med PCRE:

#include <stdio.h>
#include <string.h>
#include <pcre.h>

void test(char *s)
{
    int ix;
    pcre *re;
    int rc;
    int erroffset;
    int ovector[300];
    const char *error;
    const char *p;
    re = pcre_compile("[0-9]+",0,&error,&erroffset,NULL);
    ix = 0;
    while((rc = pcre_exec(re,NULL,s,strlen(s),ix,0,ovector,sizeof(ovector)/sizeof(int)))>0)
    {
      pcre_get_substring(s,ovector,rc,0,&p);
      printf("%s\n",p);
      ix = ovector[1];
    }
}

int main()
{
    test("abc 123 def 456 ghi 789 xyz");
    return 0;
}
Avatar billede bertelbrander Novice
21. januar 2009 - 20:22 #5
Med hensyn til std:: foran. Jeg har gjort det til en vane at undlade:
using namespace std;
For at undgå at importere hele std's namespace. Det betyder så at jeg skal skrive std:: foran f.eks. cout og endl.

Du er naturligvis velkommen til at bruge "using namespace std;" og undlade std:: foran.

Jeg samler ikke på point.
Avatar billede kjeldsted Novice
21. januar 2009 - 21:53 #6
Ah, på den måde. Det var sku smart.

Men mange, mange tak for hjælpen så.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester