0

C で簡単なシェル プログラムを作成しています。プログラムの一部として、ユーザー入力をトークンに分割するトークナイザーを作成しています。トークナイザーが呼び出されるたびに、次のトークンが返されます。トークナイザーのコードは次のようになります。

char* nextToken(char string[])
{
char token[50]= {}; //stores the current token
//More code here, will post if necessary
puts(token);
return token;
}

int main()
{
char inputString[] = "cpgm one two <three| script a b >file";
char *token = nextToken(inputString);
while(*token!='\0') //I'm using a char[] with a single null character as a delimiter to indicate the last token has been reached
{
    token = nextToken(inputString);
}

}

このようにプログラムを実行すると、「プット」が正しく機能します。つまり、関数が呼び出されるたびに、次のように適切なトークンが正しい順序で出力されます。

cpgm 1 2 < 3 | スクリプト a b > ファイル

ただし、次のように、nextToken の「puts」行を削除してメイン関数に配置すると、次のようになります。

 while(*token!='\0')
 {
     puts(token);
     token = nextToken(inputString);
 }

代わりにメイン関数からトークンを出力しようとすると、次のような奇妙な文字のリストが表示されます。

?bHD? 「bH」「bH」「bHd」「bHd?」

� � � � bHd?

なぜこれが起こっているのですか?

ありがとう。

4

2 に答える 2

3

tokenスタックに文字列を割り当てています。これは、返却すると割り当てが解除され、使用できなくなることを意味します。代わりに、文字列にメモリを割り当てる必要があります。

char *token = malloc(50);

また、後で呼び出して、文字列を解放することを忘れないでください。

free(token);
于 2012-11-28T03:32:34.900 に答える
1

ガベージ値にアクセスしているためです。nextToken() が終了した後、auto のトークンは割り当てが解除され、呼び出し側にとってはガベージ値になります。それを解決するには、変数の有効期間を静的に変更するか、動的メモリ割り当てを行います。しかし、あなたがサイズを知っているので、それは好まれないかもしれません. ただ行う:

static char token[50];
于 2012-11-28T03:38:44.067 に答える