Pole nenačte poslední hodnotu – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Pole nenačte poslední hodnotu – C / C++ – Fórum – Programujte.comPole nenačte poslední hodnotu – C / C++ – Fórum – Programujte.com

 

NetBean0
Duch
19. 11. 2011   #1
-
0
-

Zdravim Vás. Mám menší komplikaci. Načítám hodnoty do pole a potřebuji ošetřit vstup. V případě, že bude zadané něco jiného než číslo nebo v případě, že nezadám žádnou hodnotu a rovnou program ukončím ctrl-d - tak se program ukončí a vypíše chybu. Mě to funguje celkem správně, až na to, že mi to nenačte poslední hodnotu pole.

int i = 0;
int pole[100];

while (!feof(stdin)) {
        if ((scanf("%d\n", &pole[i])) != 1) {
            printf("Chyba\n");
            exit(1);
        }       
        i++;
    }

Zvláštní je, že když mam scanf("%d%d ....) bez \n, tak to funguje správně a poslední hodnotu to načte.

if (((scanf("%d", &pole[i])) != 1) && !(feof(stdin)))

Ovšem tato varianta mi nevyhovuje, protože v případě že nezadám žádnou hodnotu a rovnou ukončím program ctrl-d tak mi to chybu nevypíše.

Věděl by jste někdo prosím, co dělám špatně? Děkuji.

Nahlásit jako SPAM
IP: 62.24.83.–
zlz
~ Anonymní uživatel
634 příspěvků
19. 11. 2011   #2
-
0
-

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.

Nahlásit jako SPAM
IP: 93.190.51.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 22 hostů

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý