1
char *extractSubstring(char *str)
{
    char temp[256];
    char *subString; // the "result"

    printf("%s\n", str); //prints #include "hello.txt"
    strcpy(temp, str); //copies string before tokenizing    

    subString = strtok(str,"\""); // find the first double quote
    subString = strtok(NULL,"\"");   // find the second double quote

    printf("%s\n", subString); //prints hello.txt

    strcpy(str, temp); //<---- the problem

    printf("%s", subString); //prints hello.txt"
    return subString;
}

strcpy した後、引用符が追加されるのはなぜですか? strcpy の 2 行目をコメントアウトすると、プログラムは動作します。printfs はプログラムから削除されます。私は自分のプログラムで何が起こっているかを示すためにそれを使用していました。

誰かが私に何が起こっているのか説明してもらえますか? ありがとうございました。

4

2 に答える 2

4

strtok()がソース文字列をその場で変更し、ポインタをそこに返すことを理解することが重要です。

したがって、2 つの呼び出しは次のようにstrtok()なりstrます。

#include \0hello.txt\0
           ^ subString points here

(簡単にするために、最終的な終了は示していません\0)。

ここで、2 番目 (「問題のある」) は次のようにstrcpy()変更strされます。

#include "hello.txt"
          ^ subString still points here

これにより、 が に"再表示されsubStringます。

これを修正する 1 つの方法は、コピーをトークン化し、オリジナルをそのままにしておくことです。関数が自動変数へのポインターを返さないことを確認してください (関数が返された瞬間にスコープ外になります)。

于 2013-10-24T11:38:19.610 に答える