3

これを行うことの問題は何ですか:

void *educator_func(void *param) {
char *lineE = (char *) malloc (1024);
size_t lenE = 1024;
ssize_t readE;

FILE * fpE;

fpE = fopen(file, "r");

if (fpE == NULL) {
    printf("ERROR: couldnt open file\n");
    exit(0);
}

while ((readE = getline(&lineE, &lenE, fpE)) != -1) {
    char *pch2E = (char *) malloc (50);

    pch2E = strtok(lineE, " ");

    free(pch2E);
}

free(lineE);
fclose(fpE);

return NULL;
}

行を削除すると正常'pch2E = strtok(lineE, " ");'に動作します...

なぜstrtok()そこにできないのですか?私strtok_r()も試してみましたが、うまくいきませんでした。

4

2 に答える 2

1

strtok は、渡した文字列に含まれるトークンへのポインターを返します。そのため、malloc で割り当てたものを (常に) 指していないため、解放できません。

この種の代入は C でも機能しません。トークンをバッファーにコピーする関数が必要な場合は、次のようになります。

tokenize(char* string, char* delimiter, char* token);

また、関数がデータをコピーするには、トークンに有効なポインターを渡す必要があります。C では、ポインターにデータをコピーするために、関数はそのポインターにアクセスする必要があるため、関数がそれを実行することは不可能です。戻り値。

そのための代替戦略 (ただし最悪) は、メモリを内部的に割り当て、呼び出し元が解放する必要があるメモリ領域へのポインタを返す関数です。

あなたの問題では、 strtok がnullを返すまで、すべてのトークンを返すために数回呼び出す必要があるため、次のようにする必要があります。

while ((readE = getline(&lineE, &lenE, fpE)) != -1) {
    char *pch2E;

    pch2E = strtok(lineE, " "); //1st token

    while ((pch2E = strtok(NULL, " ")) != NULL) {
        //Do something with the token
    }
}
于 2013-04-12T16:44:51.247 に答える