Size improvements for cat reimplementation
Do not repeat yourself. Copying stdin doesn't differ from copying any other file. There is no need to special case stdin as you do at lines 15-21.
Avoid naked loops. Every loop does an important job that deserves a name. This is strong enough reason to factor it out as a function:
Expect errors


fgetc may fail. Once fgetc returns EOF, call feof or ferror to see what has actually happened.
printf may fail. Make sure to detect (printf returns -1) and report (analyze errno) errors.

Handle options. At least recognize a standalone - as a fake file name referring to stdin.