11

Kernighan と Ritchie による C プログラミング言語でプログラムを作成しています。

私は現在、次のような演習 1-22 を行っています。

last > non-blank character入力の n 番目の列の前に発生する の後に、長い入力行を 2 つ以上の短い行に「折りたたむ」プログラムを作成します。あなたのプログラムが非常に長い行で何か賢いことをしていることを確認し、指定された列の前に空白やタブが > ない場合。

私の問題は、プログラムの実行方法ではありません...私の問題は、線をどこで折り畳むべきかということです。

「最後の非空白文字の後」とはどういう意味ですか? 線はどこで折ればいいですか?

みんな私にプログラム自体を教えないでください。自分でやりたい。

線を折るべきポイントを知りたいだけです。

編集:別の問題があります...

行に が含まれているとどうなりますtabsか? その場合、行の列の長さは文字の長さから増加します。どの長さを考慮する必要がありますか?

編集2

何か賢い...タブのケースに取り組むために、私はアイデアを持っています...

1-22 の前に、1-20 と 1-21 の 2 つの演習があります。どちらが entab と detab ですか...皆さんご存知のはずです...だから私は最初に線を detab し、それを折り畳んでから折り畳んだ線を entab します...タブの場合はそれが最も賢いと思います。誰?

4

2 に答える 2

9

この演習は基本的に、テキスト エディターで見られる "ワード ラップ" 機能をエミュレートしていると思います。「空白」は、スペースやタブ文字などの「空白」を意味します。

例:

"Once upon a time"

入力の 14 列目の後にその行を「折りたたむ」ように求められた場合、14 番目の文字は「time」の「i」です。出力は次の 2 行になります"Once upon a", "time"

質問はまた、非常に長い行で知的であることを示しています.

例えば、

"Once upon a time Once upon a time Once upon a time"

この行を 14 文字で分割する場合は、行を 3 行以上に分割する必要があることを考慮する必要があります。

単語が非常に長く、分割できない場合もあります。

"Deoxyribonucleicacid is DNA"

それを 14 文字で分割すると、 まで空白文字が見つからない" is"ため、単語を分割する必要があります。

最後に、質問が少しあいまいであることに同意しますが、必要なものに沿ってコードを書いている限り、学習しているので、詳細。幸運を :)

于 2013-02-10T12:32:39.833 に答える
1

この例を考えてみましょう: n = 6(数えやすくするために) としましょう。折り畳む必要がある行は次のようになります。

Got all chars on one line.
00000000001111111111222222
01234567890123456789012345

生成している行の現在の位置を数えて文字を調べます。空白を見つけたら、戻ってその前の空白以外の最後の文字を見つけ、その位置を確認します。カウンターが に達したらn、元の行でスペースの前にある空白以外の最後の文字がどこにあったかを確認し、行を折ります。

上記の例では、最初に表示されるスペースは 3 の位置にあります。この時点で 1 文字戻り、スペースの前の最後の非ブランクとして 2 をマークし、次に進みます。カウントが (文字 で'l') 6 に達したら、位置 3 で行を分割し、現在の位置をゼロにリセットします。7、13、および 20 でフォールドするアルゴリズムを続行します。

Got
all
chars
on one
line
于 2013-02-10T12:45:27.280 に答える