To \n ve scanf neznamená konkrétně konec řádku, ale "bílý znak" (angl. white space). Resp. řadu (nula nebo více) takových znaků. A konec té řady se pozná až načtením dat za ní. V praxi to znamení, že ti ten scanf "doběhne" třeba až po zadání dvou nebo více řádků. Ve tvém případě je to celkem jedno, ale je dobré to vědět a raději to \n vyhoď.
Další drobnost. Konec souboru se většinou pozná až když na něj při čtení narazíš. Takže test před čtením je celkem k ničemu. Takže "lepší" je ta druhá varianta. Ale v tomto případě je to zase celkem jedno.
Hodnoty. Předpokládám, že používáš Windows. Tam je konec souboru ^Z a ne ^D. Takže ty hodnoty ti to načte všechny, alepak to hodí na chybu na tom ^D, což tě mate. Zkus si ty hodnoty vypisovat a případně dej vědět, jestli se pletu.
A co se týče toho hlídání vstupu, tak to bych udělal úplně jednoduše. Čteš dokud je v poli místo a daří se načíst platnou hodnotu. A pak jen zkontroluješ, co ten cyklus přerušilo a kolik jsi načetl hodnot a hotovo.