質問: max) break; } } /* 実行時のコンソール画面 C:\MinGW\users\chap09\kadai>gcc -I. -o kad9-5 kad9-5.c pdcurses.a C:\MinGW\users\chap09\kadai> kad9-5 a.c -n8 mは「8」です 読み込みファイル名 : a.c 書き出しファイル名 : b.txt 0001 /*プログラムソースファイルを行ごとに読み込んで,行頭に行番号 をつけて,テキストファイルに書き出す。 0002 0003 あらかじめチェック用プログラムソースファイル「a.c」をテキス トエディタでつくってから実行し, 0004 「b.txt」が出来たことを確認して,テキストエディタで「b.txt」 を見るとよい。 0005 0006 関数fgets()は,ファイルから一行を読み込み文字列にする。 0007 一行とは,改行文字があるところまでの文字列。 0008 C:\MinGW\users\chap09\kadai> ```
回答: copy関数内のmaxの値が不定です。(グローバル変数maxとここのmaxは別物です。) > > > ``` > void copy(FILE *src, FILE *dst) > { > int ch; > int i; > int max; > > while ((ch = fgetc(src)) != EOF) { > fputc(ch, dst); > if(ch == '\n') //改行をカウント > i++; > if(i == max) > break; > } > } > ``` > > 引数maxを追加するのが最もシンプルに思えます。 グローバル変数を使っても解決出来ますが、あまり良い作法とは言えないでしょう。 ついでに言うと、iの値が不定なのもよくないですね。 何らかの変数を参照する際には、適切に初期化されているか確認する癖をつけた方が良いです。 適当に作ってみました。 ``` void copy(FILE *src, FILE *dst, int max) { char ch; for(int i = 0; i < max; i++) { while((ch = fgetc(src)) != '\n') { if(ch == EOF) return; fputc(ch, dst); } fputc('\n', dst); } } ``` Cではデフォルト引数が(確か)使えないので、10という数値は呼び出し側で指定してください。 デフォルト引数もオーバーロードも工夫なしに使えないのは不便ですね...