>>521
んじゃ、「宿題だから手を抜いた」とか「宿題に一々文句言うな」は抜きで宜しく。

・エラーメッセージ
(元仕様で書かれているならその限りではないが)Unix系のツールに倣うなら、標準出力ではなく標準エラー出力に出力した方がいい。
キーワードを[]で囲むとオプション(=省略可)と思われるから要注意。
「ファイルを開けない」理由が「ファイル名間違い」とは限らない。

・fgets()
fgets(buf, sizeof(buf), fp)とした方が、配列のサイズを変えたときに安心。


・変数名
retと言う名前でループ制御はいただけない。まして戻り値でさえないのだから。
lenを違う目的に使い直すのはミスリードの元になる。けちらず別の変数にしたほうがよさそう。

・ループ
外側のループは、明らかに回しすぎ。どう実装するかは兎も角、
0からstrlen(line)まで回すのではなく0からstrlen(line) - strlen(str)だけ回せば済むはず。