作ってわかるCプログラミング
技術評論社

作ってわかる
Cプログラミング

章末問題へのヒント


第1章

問題1

hello.cは4行のテキストから成っている。 もし改行がなくて1行に繋がっていたらうまくコンパイルされるだろうか? どの改行と空白を取り除いたらエラーになるかを調べよ。

改行せずに、その代わりに空白を空けてみる。これでも実行結果は同じだ。

main { printf("hello, world\n"); }

逆に、次のように改行したらどうなるだろう?

mai
n {

問題2

hello.cで表示するメッセージが長大で、画面やウィンドウの横幅より大きい場合は どうなるか?

「hello, world」の代わりに、 「Pablo Diego Jose Francisco de Paulo Joan Nepomuleno Maria de los Remedios Cipriano Santisima Trinidad Ruiz y Picasso」 を出力するとどうなるだろう?

問題3

hello.cを改造し、日本語のメッセージを表示するようにせよ。

「hello, world」の代わりに、 「こんにちは。」と出力するわけだ。


第2章

問題1

typ2でテキストファイル以外のファイルを読み込ませたらどうなるか。

たとえば、Windowsでは拡張子が.exeのファイルはテキストファイルではない。Unixでもa.outなどの実行形式のファイルはテキストファイルではない。

問題2

typ2で長大なテキストファイルを画面に表示しているとき、 途中で中止して終了したいときにはどうすればよいか。

環境によって方法は異なるが、各自の環境のマニュアルを読むこと。 Unixなどではstty allで分かるかもしれない(さらにman sttyする必要もあるかも)。


第3章

問題1

fopen()関数のファイルのオープンモードに「テキストモード」と 「バイナリーモード」の区別がある環境が存在する。 テキストファイルを変換しながら読み込むためのものだ。 そのような環境においてプログラムcat3.cを実行してファイルを連結する際に 問題になる点を考察せよ。

たとえばWindowsのテキストファイルの“改行”は1文字じゃなくて 2文字分(Cの書き方で言えば\r\n)だ。 これを読んだときに\n1つ分に変換し、 逆に、ファイルに書き出す


第4章

問題1

upper3.cをさらに改良し、「大文字を小文字に」だけでなく、 「小文字を大文字に」する機能も付けよ。

オプションの指定方法をどうするか? (使うアルファベットは何にするか)

問題2

「大文字を小文字に」する指定と「小文字を大文字に」する指定を 同時に行った場合は、プログラムはどのような出力をすべきか 考察せよ。

つまり、両方の指定を同時にしてしまったときにどう動くか をきちんと考えなければいけない。 エラーにするか、無効にするか(どちらも指定しなかったことにする)、 両方有効にするか?


第5章

問題1

ce4に「小文字を大文字にする」機能を付け加えるよりも、 第4章のupper3と組み合わることで実現したほうがよい。 自分の環境でこの2つを「組み合わせて使う」方法を調べよ。

Unixのshやcshには“パイプ”という機能がある。

問題2

ce4をさらに改良し、文字列の前に出力する調節の空白の代わりにピリオド「.」 を出力する機能を付けよ。

「空白でなくてピリオドを出力」することを指定するオプションの与え方の 仕様はよく考えよう。当然ほかの文字を出力する機能を付け加えるときのことも 考え、そのときに矛盾しないように考えておこう。


第6章

問題1

find2を改良し、指定した文字列が「見つからなかった」行だけを 出力する機能を追加せよ。

どういうときに便利なのかをよく考えよう。 たとえば具体的にどういう場合なのかの例をあげてみよう。

問題2

find2を改良し、指定した文字列が「見つかった」行の番号(そのファイルの中の 何行めか)を、行そのものの前に出力できる機能を付けよ。

どのような表示形式がいいかも検討しよう。

単純なもの
10: 1つめ
125: 2つめ
2355: 3つめ
数値を右そろえ(その場合は何桁を最大とするかを検討すること)
  10: 1つめ
 125: 2つめ
2355: 3つめ
ズレをゼロで補う
0010: 1つめ
0125: 2つめ
2355: 3つめ

第7章

(本章には問題がない)


第8章

問題1

sort4を改良し、ソーティングにおける大小比較処理の際に、 行の先頭から指定しただけのバイト数分を読み飛ばしてから「比較」することが できるようにせよ。

具体的には、次のように並んでいる行に対して、先頭の10文字分(日付が書いてある)の無視して それより後の部分に関して「大小比較して並べ替え」したい場合などに使う 機能だ。

2001/10/03 ACCORDEON
2001/06/10 COULEUR CAFE
1999/01/14 VIENS A SAINT GERMAIN

第9章

問題1

page3を改良し、一度に表示する行数(1ページの行数)を起動時のコマンドライン で指定できるようにせよ。

0行と指定されたらどうするかなども考えておこう。


第10章

問題1

editを改良し、 「3,10d」のようにカンマで区切って行の範囲を指定して、 削除(d)、表示(p)、書き出し(w)ができるようにせよ。

1,10p「1〜10行めを表示」のように使えるようにするわけだ。 pやdの前が「数字のカンマだけか」「カンマは1つだけか」「カンマの前後の数値は前のほうが小さいか」などをチェックしなければいけないことを お忘れなく。

問題2

d指令やp指令にて、 数字で行を指定する方法以外にも、 ``指定した単語を含む行''を指定できるようにせよ。 具体的には、 「/duck/」と記述すれば カレント行から順に探しはじめて 最初にみつかる「duck」を含む行を意味するようにせよ。

つまり、/abc/,/def/d と書いて、 「abc」という文字列を含む行から「def」という行を含む行までの範囲を 削除できる、といった感じだ。

問題3

s/WWW/World Wide Web/」のように記述して、 その行の内容に「WWW」という部分を見つけたら 「World Wide Web」に置き換えるようにせよ(置換機能)。

バッファーの中でデータを“ずらす”ことを考えると難しい。 短くなるときはともかく、長くなるときには後ろが“はみだしてしまう”からだ。 それよりは、置換結果用に別に領域を確保し、そちらに前後の行をつなぎ変えて、 以前の領域は解放してしまうのがよいだろう。

問題4

editを元にして、 指令をコマンドラインやファイルから読み、 標準入力を処理するようなストリームエディターを作成せよ。

ファイルから読む場合は、 第6章のプログラムのように「-f ファイル名」でそのファイルを 読めるようにするとよいだろう。 コマンドラインに直接指令を書くときは1つめのパラメーターとして指定し、 2つめ以降をファイル名だと解釈する。


第11章

(本章には問題がない)


第12章

(本章には問題がない)


→戻る

−注意−
このWWWページで使用されている画像・文章およびデータは、すべて著作権法上の保護を受けています。