fopen したファイルの中身が
だったとします。
fgets で s に { 'a', 'b', 'c', '\n', '\0' } の5バイトが
読み込まれます。
strlen は '\0' の前までの文字数を返しますから、len は 4 です。
buff の指す領域には、'\0' も含めた 5 バイトを格納しないと
いけないので、(len + 1) バイト確保します。
strcpy で '\0' を含む 5バイトをコピーします。
index は 4 になります。これは buff の指す領域の中の
'\0' 以外の総文字数です。領域のサイズは (len + 1) です。
次の fgets で s に { '1', '2', '3', '4', '5', '\n', '\0' } の
7バイトが読み込まれます。
len は 6 です。
"abc\n" を "abc\n12345\n" にしないといけないので、必要な領域の
サイズは 4 + 6 + 1 です。+1 は最後の '\0' の分です。
strcpy は buff + 4 の位置にコピーしますから、
最初の '\n' の後の '\0' は '1' によって上書きされてなくなります。
buff の指す領域には '\0' は常に最後の 1つしかありません。
なぜ、複数の '\0' が存在すると思ったのですか?
上記のように、具体的な例でコードをトレースしてみましたか?