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.



  • ...


Anmelden zum Antworten