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.
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?
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;
}
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.
21. januar 2009 - 21:53
#6
Ah, på den måde. Det var sku smart.
Men mange, mange tak for hjælpen så.