2017-09-21 6 views
-1

Ich bekomme eine Zeichenfolge wie diese von C-Buchse recv Funktion und möchte Ideen, wie Sie es verarbeiten und numerische Werte erhalten, die neben den Buchstaben (S, L, E ...) auf der stringSo verarbeiten recv zurück

[email protected]@L1550 @W 
>E0578A9069C0000 
>S0223W0418 
>R2219H1429S0000 
>G0156V0116T1800 
>m0138 
>m0087 

Zum Beispiel Brief, müssen Sie die numerische 223 und das gleiche zu anderen;

Dachte eine Schleife zu tun und alle Vektor und die Überprüfung der Schlüsselwörter zu lesen. aber nicht sicher, ob eine gewisse Art und Weise hat leichter oder schneller

+0

Bitte erklären Sie Ihr Problem ein wenig weiter, da es nicht 100% klar ist. – Idan

+0

@Idan Ich bekomme diese Zeichenfolge oben von der Recv-Funktion und muss Werte davon erhalten. Der Wertebereich der Zahlen, die hinter einem Buchstaben stehen, zum Beispiel E, muss 57 bekommen, von W müssen 418 erhalten werden. War das klar? – antoniogbn

+0

Wenn es ein Netzwerk-Stream ist, würde ich mit einer char-by-char-Zustandsmaschine gehen –

Antwort

0

mit diesem Code eine Art und Weise zeigt, um den Job zu tun.

/* SO 4635-2633 */ 
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

int main(void) 
{ 
    char data[] = 
     "[email protected]@L1550 @W\n" 
     ">E0578A9069C0000\n" 
     ">S0223W0418\n" 
     ">R2219H1429S0000\n" 
     ">G0156V0116T1800\n" 
     ">m0138\n" 
     ">m0087"; 
    const char digits[] = ""; 

    printf("Raw data:\n[%s]\n", data); 

    size_t offset = 0; 
    size_t skip; 
    //for (skip = strcspn(data + offset, digits); 
    //  data[skip] != '\0'; 
    //  skip = strcspn(data + offset, digits)) 
    while (data[(skip = strcspn(data + offset, digits))] != '\0') 
    { 
     size_t len = strspn(data + offset + skip, digits); 
     if (len == 0) 
      break; 
     char numstr[32]; 
     memmove(numstr, data + offset + skip, len); 
     numstr[len] = '\0'; 
     int number = atoi(numstr); 
     printf("Number %4d (position %2zu..%-2zu - [%.*s])\n", 
       number, offset + skip, offset + skip + len - 1, 
       (int)len, data + offset + skip); 
     offset += skip + len; 
    } 

    return 0; 
} 

Wenn er gestartet wird, ist der Ausgang:

Raw data: 
[[email protected]@L1550 @W 
>E0578A9069C0000 
>S0223W0418 
>R2219H1429S0000 
>G0156V0116T1800 
>m0138 
>m0087] 
Number 1550 (position 6..9 - [1550]) 
Number 578 (position 16..19 - [0578]) 
Number 9069 (position 21..24 - [9069]) 
Number 0 (position 26..29 - [0000]) 
Number 223 (position 33..36 - [0223]) 
Number 418 (position 38..41 - [0418]) 
Number 2219 (position 45..48 - [2219]) 
Number 1429 (position 50..53 - [1429]) 
Number 0 (position 55..58 - [0000]) 
Number 156 (position 62..65 - [0156]) 
Number 116 (position 67..70 - [0116]) 
Number 1800 (position 72..75 - [1800]) 
Number 138 (position 79..82 - [0138]) 
Number 87 (position 86..89 - [0087]) 

Sie die for Schleife anstelle der auf Kosten der Verdoppelung der Aufruf an strcspn()while Schleife verwenden können. Ich zog es vor, mich nicht zu wiederholen.

+0

Ihre Logik funktioniert gut, aber nur die Werte auf der Zeichenkette und was ich versuche zu tun ist ein Weg ist, Werte aus der Zeichenfolge und speichern Sie Variable. Zum Beispiel wird der Wert nach E (057) in einer var1 gespeichert und dann mit anderen wie S, A, C. – antoniogbn

+0

Und was ist das Problem beim Speichern der Werte? Abgesehen davon, dass die Verwendung von Namen wie 'var1',' var2', ... 'var14' schmerzhaft ist und durch Elemente eines Arrays ersetzt werden sollte:' arr [0] ',' arr [1] ', ...' arr [ 13] '? Wenn Sie den Buchstaben vor die Nummer bringen müssen, ist das auch machbar. –

+0

Nicht sagen, es ist ein Problem, um die Werte zu speichern, nur sagen, die Logik sollte auf Buchstaben statt Zahlen basieren. Soweit ich verstanden habe (und tut mir leid, wenn ich falsch liege), gehen Sie durch die Zeichenfolge auf der Suche nach numerischen Werten richtig? während ich denke, der richtige Weg sollte durch die Zeichenfolge auf der Suche nach Buchstaben gehen. Code wäre wie durch die Zeichenfolge gehen und wenn gefunden E, dann "ops warten, ich fand E so speichern nachfolgenden Wert auf varx oder var [0]" und weiter bis Ende der Zeichenfolge. Nicht zu sagen, dass dein Code falsch ist, ich versuche nur, Code selbst zu machen mit dem, was ich brauche. – antoniogbn

1

Ich werde die allgemeine Idee erklären und lassen Sie den Code selbst schreiben.

  1. Erstellen Sie einen Zeichenpuffer, der die gesamte Zeichenfolge enthält.
  2. Erstellen Sie einen weiteren Zeichenpuffer in der Größe 5, die Anzahl der Ziffern in jeder Zahl - nennen Sie es digits_char_array.
  3. Run in einer Schleife über die char buffer, und wenn die aktuelle char ein Buchstabe ist, an die digits_char_array follwoing 4 Zeichen kopieren. Sie können strncpy oder memcpy verwenden.
  4. Konvertieren digits_char_array durch eine entsprechende Funktion, wie atol