substring aus einen string extraieren
-
Hallo,
ich breche mir einen ab, ein paar Werte aus einem String zu ziehen. Hier der string (buffer einer telnet-anfrage):
mac=00:08:DC:xx:xx:xx boot=1 fw=05.04 time=1261079052 zpb=DE0000000000000000000000000000123 /ELS4\@V9.30 F.F(00000000) F.F.1(00000000) F.F.2(00000000) 0.0.0(92251502) 0.0.1(00000000) 0.0.2(03250667) 0.9.1(165910) 0.9.2(130413) 1.7.0(0.209*kW) 1.8.0(005368.4*kWh) 1.8.0*03(005237.8) 1.8.0*02(004861.3) 1.8.0*01(004386.2) 1.8.0*12(003911.7) 1.8.0*11(003400.7) 1.8.0*10(003096.9) 1.8.0*09(002872.2) 1.8.0*08(002706.6) 1.8.0*07(002551.6) 1.8.0*06(002418.9) 1.8.0*05(002293.6) 1.8.0*04(002170.1) 2.7.0(0.000*kW) 2.8.0(002098.7*kWh) 2.8.0*03(002062.6) 2.8.0*02(002000.0) 2.8.0*01(001994.2) 2.8.0*12(001992.9) 2.8.0*11(001990.9) 2.8.0*10(001984.1) 2.8.0*09(001943.9) 2.8.0*08(001836.6) 2.8.0*07(001656.9) 2.8.0*06(001460.8) 2.8.0*05(001288.3) 2.8.0*04(001059.9) C.4.0(00800080) C.5.0(0020C0F0) C.7.0(0001) 0.2.0(F9DB) 0.2.2(00000SPA)
Bisher hole ich einen Wert aus dem "buffer" so raus.
char buffer[1024]; char *token[41]; char *tmptoken[4]; char *valtoken[2]; char livebezug[10]; //line by line dissection strtoken(buffer, "\r", token); // extract substring "Bezugsleistung" strtoken(token[9], "(", tmptoken); strtoken(tmptoken[1], "*", valtoken); strcpy(livebezug, valtoken[0]);
Geht das nicht irgendwie komfortabler und vorallem sicherer, falls mal anderen Zeilen dazwischenhauen?
Hat jemand eine Idee? Irgendwie mit dem Präfix "1.7.0(" und dann bis zu "*kW)". Die Zahl (String) dazwischen bräuchte ich.Danke für evtl. Hilfe.
VG
Nico
-
zeilen 1 bis 47 sind alle in einem array oda watt?
dann reicht im einfachsten fall sowas in der art:double value; char* substr "1.7.0("; char* p = strstr(buffer, substr); if(p) { p += strlen(substr); value = strtod(p,NULL); // value = 0.209 }
-
Für sowas nimmt man fgets+sscanf, z.B.:
char b[100],s[100]; while( fgets(b,100,f) ) if( 1==sscanf(b,"%*[^(](%[^)]",s) ) puts(s);
strtoken ist kein Standard, soll das Eigengefrickel sein?
-
Wutz schrieb:
char b[100],s[100]; sscanf(b,"%*[^(](%[^)]",s) )
-
ups...die function hatte ich vergessen zu posten:
/* string dissection by seperator */ int strtoken(char *str, char *separator, char *token[]) { int i = 0; char *val; token[0] = strtok(str, separator); while ( token[i] ) { i++; token[i] = strtok(NULL, separator); } return ( i ); }
Vielen Dank für die Hilfe! Ich teste es mal aus!
-
Wutz schrieb:
Für sowas nimmt man fgets+sscanf, z.B.:
char b[100],s[100]; while( fgets(b,100,f) ) if( 1==sscanf(b,"%*[^(](%[^)]",s) ) puts(s);
strtoken ist kein Standard, soll das Eigengefrickel sein?
okay...ich gebe es auf. Ich verstehe es nicht einmal ansatzweise...
Ich habe einen
char buffer[1024];
In den lese ich via TCP Socket den obigen gesamten String ein.
Der gesuchte Suchstring soll nachher 0.209 sein. Mit keinen der Tipps komme ich dahin.
-
...
-
Vielen, vielen Dank. Es funktioniert tadellos. Ich werde mich mal durcharbeiten!
Besten Dank! Ein super Forum. Schönes Wochenende!
-
sscanf( line, "%*[^(](%[^*]%c%*s"
Das endende "%*s" ist unnötig wie ein Kropf.
-
...