0

そこで、PHP の爆発関数に相当する C 関数を探しています。慣れていない方のために: Explode は文字列を取得し、指定された文字/エスケープ シーケンスで区切られた各エントリを解析します。この関数の最も優れた点は、その戻り値です。これは、すべてのエントリを含む既に偽造された配列です。問題は、これが C に存在しないように見えることです。利用可能な最も近い関数は strchr ですが、分割の最初の発生へのポインターのみを返します。

編集:ここに関数がありますが、動作は異なりますが(戻り値が異なるなど)、それは私が望むものです。

int explode(char* str, char* delim, char ***r) {
    char **res = (char**) malloc(sizeof(char*) * strlen(str));
    char *p;
    int i = 0;
    while (p = strtok(str, delim)) {
        res[i] = malloc(strlen(p) + 1);
        strcpy(res[i], p);
        ++i;
        str = NULL;
    }
    res = realloc(res, sizeof(char*) * i);
    *r = res;
    return i;
}

次のように呼び出すことができます。

char str[] = "test1|test2|test3";
char** res;
int count = explode(str, "|", &res);
int i;
for (i = 0; i < count; ++i) {
    printf("%s\n", res[i]);
    free(res[i]);
}
free(res);
4

1 に答える 1

1

を使用しstrtok()ます。そのマニュアルページから:

strtok() 関数は、文字列を一連のトークンに解析します。strtok() の最初の呼び出しでは、解析する文字列を str で指定する必要があります。同じ文字列を解析する必要がある後続の各呼び出しでは、str は NULL である必要があります。

strtok() を呼び出すたびに、次のトークンを含む null で終わる文字列へのポインターが返されます。この文字列には、区切りバイトは含まれません。それ以上トークンが見つからない場合、strtok() は NULL を返します。

つまり、文字列をループし、strtok()返されるまで呼び出しを続けてNULL、すべての単語 ( の最初の呼び出しに指定された区切り記号で分割されるstrtok()) を として返しますchar*

于 2014-01-25T13:15:10.630 に答える