1

「真珠のプログラミング」:真珠の文字列、セクション15.3(テキストの生成)では、作成者が入力ドキュメントからランダムなテキストを生成する方法を紹介しています。ソースコードには、わからないことがいくつかあります。

for (i = 0; i < k; i++)
        word[nword][i] = 0;

著者は次のように説明しています。「入力を読み取った後、k個のヌル文字を追加します(比較関数が最後から実行されないようにします)。」この説明は、これらの2行にコメントした後でもうまく機能するため、私を本当に混乱させます。なぜこれが必要なのですか?

4

2 に答える 2

4

そうすることで、文字ごとの比較を行うときに対処しなければならない奇妙なケースの数を減らすことができます。

 alphabet
 alpha___

この1文字を一度にステップ実行し、最後のnullパディングalphaがなかった場合は、次の要素を調べて、配列の最後から実行しようとします。nullパディングは、基本的に、一方の単語に文字がある場合、もう一方の単語に対応する文字があることを保証します。また、ヌル文字の値は0であるため、短い単語は常に長い単語よりも「小さい」と見なされます。

これらの線がなくても機能するように見える理由については、次の2つの理由が考えられます。

  1. これはCで書かれました。Cは配列の境界を保護しません。割り当てられたスペースを超えているジャンクデータはすべて読み取ることができ、何も聞こえません。
  2. 入力ドキュメントは、一方が他方のプレフィックスである2つの文字列を決して比較しないように作成されています(のようalphaalphabet)。
于 2012-11-06T05:54:34.090 に答える
4

別の回答ですでに説明したように、目的は文字列をnullで終了することです。

しかし、私は投稿されたリンクを読みました、そしてそのループは意味がありません。使用されている比較関数を見ると、この場合、文字列全体をゼロで埋める必要がある理由はありません。word[nword][0] = 0;forループのないプレーンでも同じように機能します。またはできれば:

word[nword][0] = '\0';

文字列全体をゼロで埋めると、かなりのオーバーヘッド実行時間が追加されます。

于 2012-11-06T07:42:27.457 に答える