19

K&R の「The C Programming Language」という本から C を学んでいます。本に書いてある練習をしています。演習番号 1.16 を実行していますが、理解できません。

演習 1.16:

最長行プログラムのメインルーチンを修正して、任意の長さの入力行の長さを正しく出力し、可能な限りテキストを出力するようにします。

私の質問:

  1. 「...テキストの可能な限り...」 - 文字列の長さに制限はありますか? たぶん、標準ヘッダーには、文字列の長さの最大許容値を持つ変数がありますか?

  2. 「...任意の長さの入力行の長さ...」-しかし、コードではMAXLINEは1000と定義されています。これも制限されたサイズです。ここにいくつかの解決策がありますが、私の意見では、前者には行の長さ (1000 文字) に制限があるため、解決策の決定ではありません。

多分私はその仕事を理解していませんでした。私の理解では、1000 文字の制限を削除する必要があります。

4

6 に答える 6

26

これはK&Rのかなり初期の演習であり、コードを完全に再設計するのではなく、コードにいくつかの小さな変更を加えることになっています。

  1. 「...可能な限りのテキスト...」

    解釈するのはあなた次第です。longestバッファに保存されているものを印刷することでそれを行います。つまり、最大1000文字の行を印刷します。繰り返しになりますが、これは初期の演習であり、動的に割り当てられたメモリについてはまだほとんど紹介されていません。また、K&Rが作成された時点では、任意の長さのテキスト行を保存することは、現在ほど実現可能ではありませんでした。

  2. 「...任意の長さの入力行の長さ...」

    難しい要件です。どんなに長くても(少なくともint。の範囲内で)正しい長さを見つけることになっています。

この問題を解決する1つの方法は次のとおりです。

  • getline()を呼び出した後、バッファに読み込まれた最後の文字がline改行であるかどうかを確認します('\ n')
  • もしそうなら、あなたは完全な行を読みます。変数は行のlen正しい長さ(getline()の戻り値)であり、元のコードと比較して特別な考慮は必要ありません。
  • そうでない場合は、行全体を読んでいないため、この行の終わりを探す必要があります。whileループを追加し、改行(またはEOF)が返されるまでgetchar()を呼び出し、そのループで読み取った文字数をカウントします。len++数えるだけです。
  • whileループが完了すると、newlenは実際の行の長さになりますが、バッファーには最初の999文字しかありません。
  • line以前と同様に、この行がこれまでで最も長い場合は、現在のバッファー(最大1000文字)を保存(copy()関数呼び出し)します。
  • 完了したら、前と同じように保存された行(longestバッファー)とmax長さの変数を出力します。
    • 上記のwhileループにより、そのmax長さは正しくなりました。
    • longest行が実際に1000文字より長い場合。少なくとも最初の999文字を印刷します。これは「可能な限り」です。

私はそれを台無しにして、これを達成するために必要なコードを投稿しませんが、演習1-16の最長行プログラムに追加する必要があるのはわずか6行のコードです。

于 2013-02-27T18:57:29.710 に答える
2
  1. 最新のマシンでは、自動的に行を折り返す端末プログラムのおかげで、「できるだけ多くのテキスト」がすべてのテキストになる可能性があります。その本は、テレタイプ端末がまだ使用されていたときに書かれました。おそらく作業しているマシンのメモリ制限以外に、文字列の長さに制限はありません。

  2. MAXLINE彼らは、サイズのバッファへの読み取りに確実に改行が含まれると想定するのではなく、文字を読み取って改行を探すために何らかのループを追加することを期待しています。

于 2013-02-27T18:46:40.300 に答える
0

コピーできる文字数の制限が非常に小さく (たとえば 100 文字)、プログラムがそれよりも長い行間を判断することになっていると想像すると、この演習は実際により意味のあるものになることを提供したいと思います。限界。

(制限を実際に変更して非常に小さくすると、コードのテストが容易になります。その小さな制限に達する最初の行を選択すると、コードが機能していないことがわかりますが、最初の行を返す場合は、ただし、最長の行の多くの文字、それは機能しています.)

改行、EOF、または行サイズ制限に達するまで、文字をコピーしてカウントするコードの部分を保持します。getchar() がまだ EOF または改行を返さない限り、このカウントとコピーが終了した場所をピックアップし、コピーが停止した後もカウントを続けるコードを追加します。

于 2020-11-07T01:31:40.183 に答える