はじめての C

C programming note*1
toupper() と islower() については、K&R 2nd の 「7.8 雑関数」(p203) に その説明が 載っています。これらの関数を 使用するには ヘッダファイルの ctype.h を インクルードしておきます。
同じような 働きをするものも 含めて、

toupper(c) c を 大文字に 変換
tolower(c) c を 小文字に 変換

islower(c) c が 小文字なら 0 以外、そうでなければ 0 (を 返す)
isupper(c) c が 大文字なら 0 以外、そうでなければ 0

isalpha(c) c が アルファベットなら 0 以外、そうでなければ 0
isdigit(c) c が 数字 (0 〜 9) なら 0 以外、そうでなければ 0
isspace(c) c が ブランク、タブ、改行、復帰、垂直タブなら 0 以外、そうでなければ 0

(小文字を 大文字に 変換するのに) toupper ライブラリ関数を 使えば (特定の、例えば ASCIIコード体系等に 依存せず) その Cコンパイラが 想定している 環境での 文字コード体系に 合わせて うまく やるように なっているはずだ。

自分で 一から つくるよりも、同じことをする ライブラリ関数が あるなら、そのライブラリ関数を 使うようにすること。

誤りの 入り込む余地が その分 少なくなるわけだし、プログラムも 単純になる。 よりシンプルな プログラムほど 信頼性を 増すのだ。(p100)

大文字を 小文字に 変換するのなら、少し コードを いじって、

while )((c = fgetc(fp))( != EOF) {
if (iskanji(c)) {
fputc(c, stdout);
fputc(fgetc(fp), stdout);
}
else if (isupper(c))
fputc(tolower(c), stdout);
else
fputc(c, stdout);
}
とすれば、OK。
(追記) 気づいてるかもしれないけど、linux/gcc の 環境では、この iskanji という 関数を わざわざ 使わなくても 問題ありません。
インストールの際に EUC_jp ロケールを 選択しておけば、ライブラリ関数*2が 先の マクロと 同じ操作を (黙って) してくれてるようです。

*1:「作ってわかる Cプログラミング」

*2:fgetc や fputc