2017-09-21 5 views
-1

Je reçois une chaîne comme celle-ci de C socket recv fonction et aimerais des idées comment le traiter et obtenir des valeurs numériques qui vient à côté des lettres (S, L, E ...) sur le chaîneComment traiter le retour recv

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

Par exemple lettre, besoin d'obtenir le 223 numérique et la même chose à d'autres;

Pensait faire une boucle et lire tous les vecteurs et vérifier les mots clés. Mais je ne sais pas si cela est plus facile ou plus rapide

+0

Veuillez expliquer votre problème un peu plus loin car il n'est pas 100% clair. – Idan

+0

@Idan Je reçois cette chaîne listée ci-dessus depuis la fonction recv et j'ai besoin de récupérer des valeurs. Les zones de valeurs les nombres qui viennent après une lettre, par exemple E, doivent obtenir 57, à partir de W besoin d'obtenir 418. Était-ce clair? – antoniogbn

+0

Si c'est un flux réseau, j'irais avec une machine d'état char-by-char –

Répondre

0

Ce code montre une façon de faire le travail.

/* 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; 
} 

Lors de l'exécution, la sortie est:

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]) 

Vous pouvez utiliser la boucle for en place de la boucle while au coût de duplication de l'appel à strcspn(). J'ai préféré ne pas me répéter.

+0

votre logique fonctionne bien mais énumère seulement les valeurs sur la chaîne et ce que j'essaye de faire est une manière d'obtenir des valeurs de la chaîne et d'enregistrer sur la variable. Par exemple, la valeur après E (057), sera sauvegardée dans une variable var1 puis fera la même chose avec d'autres comme S, A, C. – antoniogbn

+0

Et quel est le problème avec la sauvegarde des valeurs? Mis à part le fait que l'utilisation de noms comme 'var1',' var2', ... 'var14' est douloureuse et devrait être remplacée par des éléments d'un tableau:' arr [0] ',' arr [1] ', ...' arr [ 13] '? Si vous avez besoin de la lettre avant le numéro, c'est faisable aussi. –

+0

Ne pas dire que c'est un problème pour enregistrer les valeurs, seulement en disant que la logique devrait être basée sur la lettre plutôt que sur les chiffres. Pour autant que j'ai compris (et désolé si je me trompe) vous allez à travers la chaîne à la recherche de valeurs numériques non? alors que je pense que la bonne façon devrait aller à travers la chaîne à la recherche de lettres. Le code serait comme aller à travers la chaîne et si trouvé E, alors "les opérations attendent j'ai trouvé E alors sauve la valeur ultérieure sur varx ou var [0]" et continue la recherche jusqu'à la fin de la chaîne. Ne pas dire que votre code est erroné, juste essayer de faire du code moi-même avec ce dont j'ai besoin. – antoniogbn

1

Je vais vous expliquer l'idée générale et vous laisser écrire le code par vous-même.

  1. Créez un tampon de caractère qui contient la chaîne entière.
  2. Créez un autre buffer de taille 5, le nombre de chiffres de chaque nombre - appelez-le digits_char_array.
  3. Exécutez une boucle sur le tampon char et, si le caractère courant est une lettre, copiez les 4 caractères suivants dans digits_char_array. Vous pouvez utiliser strncpy ou memcpy.
  4. Convertir digits_char_array en utilisant une fonction appropriée, telle que atol