1

パスを含む多くのファイル名 (最大 250000 だと思います) を解析し、そこからいくつかの部分を抽出する必要があります。

次に例を示します。

オリジナル:/my/complete/path/to/80/01/a9/1d.pdf

必要:8001a91d

私が探している「パターン」は常に「/8」で始まります。抽出する必要がある部分は、8 桁の 16 進数の文字列です。

私の考えは次のとおりです(デモ用に簡略化されています):

/* original argument */
char *path = "/my/complete/path/to/80/01/a9/1d.pdf";

/* pointer to substring */
char *begin = NULL;

/* final char array to be build */
char *hex = (char*)malloc(9);

/* find "pattern" */
begin = strstr(path, "/8");
if(begin == NULL)
    return 1;

/* jump to first needed character */
begin++;

/* copy the needed characters to target char array */
strncpy(hex,   begin,   2);
strncpy(hex+2, begin+3, 2);
strncpy(hex+4, begin+6, 2);
strncpy(hex+6, begin+9, 2);
strncpy(hex+8, "\0",    1);     

/* print final char array */
printf("%s\n", hex);

これは機能します。私はそれが最も賢い方法ではないと感じています。そして、自分には見えない罠があるかもしれないと。

それで、誰かがこのポインターシフト方法で何が危険なのか提案がありますか? あなたの意見では、どのような点が改善されますか?

Cはそのようにする機能を提供していs|/(8.)/(..)/(..)/(..)\.|\1\2\3\4|ますか? 私の記憶が正しければ、一部のスクリプト言語にはそのような機能があります。お分かりでしょうが。

4

3 に答える 3

2

C 自体はこれを提供していませんが、POSIX 正規表現を使用できます。フル機能の正規表現ライブラリです。しかし、あなたのような単純なパターンの場合、これがおそらく最良の方法です。

ところで、をmemcpy好むstrncpystrncpy何が良いのかを知っている人はほとんどいません。そして、私はその一人ではありません。

于 2013-03-03T09:33:49.677 に答える
0
/* original argument */
char *path = "/my/complete/path/to/80/01/a9/1d.pdf";
char *begin;
char hex[9];
size_t len;

/* find "pattern" */
begin = strstr(path, "/8");
if (!begin) return 1;

// sanity check
len = strlen(begin);
if (len < 12) return 2; 

   // more sanity
if (begin[3] != '/' || begin[6] != '/' ||  begin[9] != '/' ) return 3;

memcpy(hex,   begin+1, 2);
memcpy(hex+2, begin+4, 2);
memcpy(hex+4, begin+7, 2);
memcpy(hex+6, begin+10, 2);
       hex[8] = 0;     

   // For additional sanity, you could check for valid hex characters here
/* print final char array */
printf("%s\n", hex);
于 2013-03-03T11:57:50.197 に答える
0

マッチングだけの単純なケースでは、/8./../../..私は個人的にstrstr()自分で解決策を探します (外部依存は必要ありません)。ただし、ルールがさらに増える場合は、レクサー ( flexとその仲間) を試すことができます。これらは正規表現をサポートしています。

あなたの場合、次のようなものです:

h2           [0-9A-Fa-f]{2}
mymatch      (/{h2}){4}

働くことができました。レクサーは通常トークン識別子を返すため、バッファを副作用によって一致するように設定する必要があります。

とにかく、依存関係がなくても正規表現の力を得ることができますが、生成された (読み取り: 読み取り不能な) コードが犠牲になります。

于 2013-03-03T10:24:14.073 に答える