2017-09-21 9 views
-1

Cソケットrecvの関数からこのような文字列を取得しています。これをどのように処理し、数値(S、L、E ...)文字列recv returnを処理するには

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

たとえば、文字223を取得する必要があります。

ループを実行して、すべてのベクトルを読み取り、キーワードをチェックすることを考えていました。 何か簡単で速いかどうかわからない

+0

問題が100%明確ではないため、もう少し詳しく説明してください。 – Idan

+0

@Idan上記の文字列をrecv関数から取得しており、その値を取得する必要があります。値域は、例えばEのような手紙の後に来る数字は、Wが418を得る必要があるから57を得る必要があります。それは明らかですか? – antoniogbn

+0

ネットワークストリームの場合、char-by-charステートマシンと一緒に行く –

答えて

0

として、適切な関数を使用することによって、このようなをdigits_char_array変換します。

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

実行すると、出力は次のとおりです。

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

あなたはstrcspn()への呼び出しを複製するコストでwhileループの代わりにforループを使用することができます。私は自分自身を繰り返さないことを好みました。

+0

あなたのロジックは正常に動作しますが、文字列の値をリストするだけで、私がしようとしているのは、文字列から値を取得し、変数に保存する方法です。例えばE(057)の後の値は、var1に保存され、S、A、Cのような他のものと同じになります。 – antoniogbn

+0

値を保存する際の問題は何ですか? 'var1'、' var2'、... 'var14'のような名前を使用することは苦痛であり、配列の要素で置き換えなければならないという事実とは別に、' arr [0] '、' arr [1] '、...' arr [ 13] '?あなたが番号の前に手紙を取る必要があるなら、それはあまりにも可能です。 –

+0

値を保存するのは問題ではなく、論理は数字ではなく文字に基づいていると言うだけです。私が理解している限り(私が間違っていれば申し訳ありませんが)あなたは文字列を数値値のために検索していますか?正しい方法は文字列を検索する文字列を通るべきだと私は思っています。コードは文字列を通過するようなものになります。見つかった場合は、 "ops waitが見つかりましたので、次の値をvarxまたはvar [0]に保存し、文字列の終わりまで検索します。 URコードが間違っていると言っているわけではなく、私が必要とするコードを自分で作成しようとしています。 – antoniogbn

1

私は一般的な考え方を説明し、自分でコードを書くことができます。

  1. 文字列全体を含むcharバッファを作成します。
  2. 5のサイズの別のcharバッファを作成します。これは、各数値の桁数です。これをdigits_char_arrayと呼びます。
  3. charバッファをループして実行し、現在のcharが文字の場合は、次の4文字をdigits_char_arrayにコピーします。 strncpyまたはmemcpyを使用できます。
  4. は、このコードは、仕事をする1つの方法を示しatol
関連する問題