2012-02-06 7 views
1

のうち、未知の部分文字列を抽出する:は、私は次の形式でデータを返すプログラムを持っている文字列

<CFData 0x1001219c0 [0x7fff7027aee0]>{length = 20, capacity = 20, bytes = 0x8deead13b8ae7057f6a629fdaae5e1200bcb8cf5} 

私は8deead13b8ae7057f6a629fdaae5e1200bcb8cf5(はい、マイナス0x)を抽出する必要があります。私はsscanfを使って試してみましたが、いくつかの正規表現を渡しましたが、私はそれについての手がかりはありません。

どうすればいいですか?コードスニペットは高く評価されています。

+0

複数の値が存在するため、抽出する16進値の識別方法を指定する必要があります。しかし、あなたがそれを見つけることができるなら、あなたは望むビットから始まる文字列にsscanfを投げることができます。 –

+0

'strstr'で' bytes = 'と' sscanf'を渡してみましたが、どこにも行きませんでした。私が遊べるコードのスニペットはありますか? –

答えて

5

あなたが入力文字列に「バイト= 0X」を検索し、最後の文字を除いて(「バイト= 0X」の終わりから)残りの文字列をコピーするstrstr()を使用することができます。

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

int main() 
{ 
    char* s = "<CFData 0x1001219c0 [0x7fff7027aee0]>{length = 20, " 
       "capacity = 20, " 
       "bytes = 0x8deead13b8ae7057f6a629fdaae5e1200bcb8cf5}"; 
    char* value = 0; 
    const char* begin = strstr(s, "bytes = 0x"); 

    if (begin) 
    { 
     begin += 10; /* Move past "bytes = 0x" */ 
     value = malloc(strlen(begin)); /* Don't need 1 extra for NULL as not 
              copy last character from 'begin'. */ 
     if (value) 
     { 
      memcpy(value, begin, strlen(begin) - 1); 
      *(value + strlen(begin) - 1) = 0; 
      printf("%s\n", value); 
      free(value); 
     } 
    } 
    return 0; 
} 
+0

助けてくれてありがとう –

1

あなたはstrtokを使ってそのトリックを行うことができます。

int main(int argc, char* argv[]) { 
    char s[] = "<CFData 0x1001219c0 [0x7fff7027aee0]>{length = 20, capacity = 20, bytes = 0x8deead13b8ae7057f6a629fdaae5e1200bcb8cf5}"; 
    const char *tok = "<>[]{}= ,"; 
    char* t = strtok(s, tok); 
    int take_next = false; 
    char * res; 
    while (t) { 
     if (take_next) { 
      res = t+2; 
      break; 
     } 
     take_next = !strcmp(t, "bytes"); 
     t = strtok(NULL, tok); 
    } 
    printf("%s\n", res); 
    return 0; 
} 

これは単なるサンプルであることに注意してください。 strtokは再入可能ではないため、strtok_rを使用して書き直すことを強く検討する必要があります。

関連する問題