この問題私はメモリ割り当ての問題のみが不足していると思います。ユーザーが入力したCプログラミングの文字列、ポインタ、および割り当て
(多分一番下までスキップして、いくつかの簡単な提案のための最後の質問を読んで)
私はファイルを読み込み、このプログラムを書いています。ファイルが他のファイルを「含む」場合、それらも読み取られます。別のファイルにファイルが含まれているかどうかを調べるには、文字列の最初の単語を解析します。これを行うために、私は解析された単語を返す関数を書いて、次の単語の最初の文字に設定されたポインタを渡します。たとえば、文字列を考えてみます。
はNOTEのファイルは1つのだけ、他のファイルを含めることができ
firstWord ==含める "fooが含まれ"、chPtrは==
fは私のアルゴリズムはfirstWordが文字列の等価性をテストするために解析し、 'include'を指定すると、2番目の単語を解析してファイルの有効性をテストし、ファイルがすでに読み込まれているかどうかを確認します。
私の問題は、多くのファイルが読み込まれており、chPtrが上書きされることです。だから、私は次の単語にポインタを返します。次の単語には、前のファイルの最後の数文字が含まれることがあります。テストファイル-1および偽の名前のサンプルファイルを考えてみましょう:
レッツchPtr元々同じテストファイル-1となりました「偽含める」の解析を考慮してください。
firstWordが含ま==なり、chPtrがに上書きされます抽出bを偽って指す。ですから、chPtrは関数が呼び出されるたびにchPtrが同じメモリアドレスを指しているので、testfile-1の最後の数文字です。これは私の問題です。なぜなら、私が偽を解析するとき、chPtrはlを指しているからです。私の関数のコードは次のとおりです。
char* extract_word(char** chPtr, char* line, char parseChar)
//POST: word is returned as the first n characters read until parseChar occurs in line
// FCTVAL == a ptr to the next word in line
{
int i = 0;
while(line[i] != parseChar && line[i] != '\0')
{
i++;
}
char* temp = Malloc(i + 1); //I have a malloc wrapper to check validity
for(int j = 0; j < i; j++)
{
temp[j] = line[j];
}
temp[i+1] = '\0';
*chPtr = (line + i + 1);
char* word = Strdup(temp); //I have a wrapper for strdup too
return word;
私の問題診断は正しいですか?もしそうなら、私はchPtrの深いコピーを作るのですか?また、chPtrの深いコピーを作成するにはどうすればよいですか?
ありがとうございます!
は、なぜあなたは 'STRDUP(TEMP)'とは、その後重複コピーを返すのですか?それ以外の場合は、あなたは 'free(temp)'を決して使用しないので、メモリをリークしてしまいます。実際には 'return temp;'も同様です(新しい割り当てのオーバーヘッドを省きます)。 –
「\ 0」が見つかったときに構文解析を停止しないでください。「これは私の問題です。なぜなら、私は偽を解析すると、chPtrがlを指し示すからです。 –