В 1.18 задание такое:
Write a program to remove all trailing blanks and tabs from each line of input, and to delete entirely blank lines.
соответственно, речь о строках файла, а не строках в смысле языка Си. Строки в файле разделены '\n' (по крайней мере в *nix-like системах). Поэтому пустая строка в этом задании -- всякая строка файла, в которой нет ничего кроме пробелов и табуляций.
'\n' -- это разделитель строк, он не рассматривается как часть строки файла.
'\0' -- это признак конца строки в памяти для строковых функций, работающих с ASCIIZ. С точки зрения логической строки, он не является ее частью, но с точки зрения размещения в памяти -- это часть буфера, требующая своего места. Т.е. "string" -- это 's','t','r','i','n','g','\0' -- 7 char-ов в памяти, но strlen("string") даст 6.
Алгоритм решения простой -- накапливаем в буфер идущие подряд ' ' и '\t', как только получаем непробельный символ (и не '\n'), сбрасываем буфер, затем символ, взводим флаг, что строка уже не пуста. По получении '\n' пишем его только если взведен флаг, что строка не пуста, сбрасываем флаг пустоты строки. Повторяем, пока не кончится входной поток.