6

コードで同じ関数を呼び出していない場合はすべて正常に機能しますが、関数が再帰から突然戻った場合、変数pchはNULLになります。

 void someFunction()
     {
        char * pch;
        char tempDependencies[100*64+100];
        strcpy(tempDependencies,map[j].filesNeeded);
        pch = strtok(tempDependencies,",");
        while (pch != NULL)
        {
            someFunction(); <- if i comment this out it works fine
            pch = strtok (NULL, ",");
        }
      }

したがって、たとえば、ループが文字列file2,file3,file4に作用する場合、ループは正しく分割され、文字file2列をに変更しますfile2\\000file3,file4が、次の呼び出しはにpch = strtok (NULL, ",");レンダリングpchされます0x0。再帰を呼び出すときに気づかないことがありますか?

4

2 に答える 2

11

strtok()再入可能ではありません。再帰関数で使用する場合は、を使用する必要がありますstrtok_r()

参照:strtok、strtok_r

于 2012-11-14T06:18:37.073 に答える
5

strtok前の実行が完了する前に関数を再度呼び出すことはできません-再入可能ではありません。

strtok_r代わりに、その再入可能なバージョンを使用してください。

于 2012-11-14T06:20:51.673 に答える