2

私は次のことをするいくつかのコードを持っています:

while(some condition)
{
     char *line[WORDLEN];
     //do stuff to line, including strcat(line, "words")
     printf("%s", line);
     line[0] = '\0';
}

ただし、line [0] ='\ 0'は、私が期待していることを実行していないようです。ループに戻り、宣言されたばかりのようにlineを使用します。ループは最初は希望どおりに機能しますが、その後の反復では行を新しいchar*[]として扱うことができません。理由について何か考えはありますか?

4

3 に答える 3

6
char *line[WORDLEN];

文字ポインタの配列です。私はあなたがそれを意味したのは次のとおりだったと思います:

char line[WORDLEN];

単一の文字配列。私はただ選ぶでしょう:

while(some condition)
{
     char line[WORDLEN];
     line[0] = '\0';
     //do stuff to line, including strcat(line, "words")
     printf("%s", line);
}

これにより、スコープルールに関係なく、文字列を使用して何かを開始する前に、ループを通過するたびに文字列が空になることが保証されます。

于 2010-09-16T03:52:52.177 に答える
4

コードでは、文字ポインターの配列は必要ありません。文字の配列が必要です。

while (some condition)
{
     char line[WORDLEN];

さて、ループを通過するたびに、可変行の内容は不確定になります-理論的には。特に、初めての場合、定義された値はありません。したがって、初期化する必要があります。

     char line[WORDLEN] = "";

また:

     char line[WORDLEN];
     line[0] = '\0';

これで、(特に)を含むコメント化された操作を安全に実行できますstrcat()。(まあ、それはあなたが安全にできることを前提としていますstrcat()-これは、すでにターゲット文字列にあるデータの長さ、ターゲット文字列バッファのサイズ、および追加された文字列の長さを知っていて、そこにあることを確認している限り可能です必要なものを保管するのに十分なスペースです。十分なスペースがあることがわからない場合は、クラッシュに向かっています。

     //do stuff to line, including strcat(line, "words")
     printf("%s", line);
     line[0] = '\0';

ループの開始時の初期化では、終了時のこの割り当ては不要です。

}
于 2010-09-16T03:57:42.230 に答える
1

ループするたびに行を再宣言します。

編集:そして、あなたはポインターでいくつかの奇妙なことをしています。line宣言内のcharポインタの配列です!これを試して:

char line[WORDLEN];
while(some condition)
{
     line[0] = '\0';
     //do stuff to line, including strcat(line, "words")
     printf("%s", line);

}
于 2010-09-16T03:52:48.070 に答える