Ako citat vstup, kym nenastane EOF

Programovacie jazyky, rady, poradňa...
marek788
Light Star
Light Star
Príspevky: 234
Registrovaný: 08 okt 2013, 12:40

Ako citat vstup, kym nenastane EOF

Príspevok od používateľa marek788 »

Ahojte, mam problem s jednou vecou. Nacitavam suradnicu ku ktorej pocitam najvzdialenejsi bod od suradnic, ktore boli zadane ako prve. Vypocitam max vzdialenost, vypisem a som pripraveny na dalsiu suradnicu atd dokola, kym nepride EOF, kedy program konci. Kod vyzera nejak takto

(suradnica prichadza na vstup v tvare [x, y])

Kód: Vybrať všetko

    while (!feof(stdin)){
        if ((scanf(" %c %lf %c %lf %c", &f, &cx, &g, &cy, &h))!=5 && f != '[' && g != ',' && h != ']'){
            printf("Nespravny vstup\n");
            free(polex);
            free(poley);
            polex = NULL;
            poley = NULL;
            return 1;
        }
        for (int i = 0; i < pocet; i++) {
            u = polex[i] - cx;
            v = poley[i] - cy;
            
            vysledok = sqrt((u*u) + (v*v));
            if (vysledok>max){
                max = vysledok;
            }
            
        }
        printf("Max: %g\n", max);
        max = 0;
    }
Takto to funguje, ale problem nastane vtedy, ked pride EOF, vtedy mi este raz vypise tu max hodnotu. Ukazka z konzoly:

Kód: Vybrať všetko

Nepriatel:
{ [1, 10], [2,1] , [-10, 20] }
Ciel: 
[10,10]
Max: 22.3607
[3, 4]
Max: 20.6155
Max: 20.6155
Viete mi niekto povedat, kde by mohol byt problem? A ci je taketo nacitavanie kym nepride EOF korektne? Dakujem.
Fabo
Hardcore addict
Hardcore addict
Používateľov profilový obrázok
Príspevky: 6810
Registrovaný: 16 nov 2007, 17:23
Bydlisko: 's Chravenhache
Kontaktovať používateľa:

Re: Ako citat vstup, kym nenastane EOF

Príspevok od používateľa Fabo »

EOF indikator ti samotny feof nenastavi, iba ho skontroluje ci je nastaveny. Predpokladam, ze co sa stane pri poslednom prechode je, ze EOF indikator nie je nastaveny, urobis scanf, ten prejde bez toho aby spustil if blok, a nastavi eof indikator, a kod dojde este raz do konca.
marek788
Light Star
Light Star
Príspevky: 234
Registrovaný: 08 okt 2013, 12:40

Re: Ako citat vstup, kym nenastane EOF

Príspevok od používateľa marek788 »

Diky za odpoved, skusil som to takto, moj problem to vyriesilo, ale vyskytol sa mi novy problem. A to napr, ked zadam na vstup asdf vypise mi to 5x pod seba nespravny vstup. :/

Kód: Vybrať všetko

     
   while ((c1=(scanf(" %c %lf %c %lf %c", &f, &cx, &g, &cy, &h))) != EOF){

   if (c1 != 5 || h != ']' || g != ',' || f != '['){
            printf("Nespravny vstup. \n");
            continue;
        }
        
        
        for (int i = 0; i < pocet; i++) {
            u = polex[i] - cx;
            v = poley[i] - cy;
            
            vysledok = sqrt((u*u) + (v*v));
            if (vysledok>max){
                max = vysledok;
            }
            
        }
        printf("Max: %g\n", max);
        max = 0;
    }

edit: tak pozeram, ze aj ten prvy kod, co som postol robil rovnaky problem. Takze jednu vec som asi vyriesil. Chcelo by to este vediet s tym vypisovanim nespravneho vystupu, nech to nevypisuje 4x. Ked tam zadam este dlhsi retazec, tak to vypise este viackrat. Tak neviem, ci to je ok.

edit2: takze robi to to, ze ten asdf retazec nezobere cely naraz, ale bere to len po jeden znak, cize nacita len acko, tym padom scanf vrati 1cku a nesplni sa podmienka, potom to iste s skom,deckom a efkom, tym padom 4x nespravny vstup. Viem to nejak osetrit? Nic ma nenapada.
Fabo
Hardcore addict
Hardcore addict
Používateľov profilový obrázok
Príspevky: 6810
Registrovaný: 16 nov 2007, 17:23
Bydlisko: 's Chravenhache
Kontaktovať používateľa:

Re: Ako citat vstup, kym nenastane EOF

Príspevok od používateľa Fabo »

mozes skusit pouzit gets (a sscanf), to by ti malo brat vstupy po riadkoch.
Oblak
Light Expert
Light Expert
Príspevky: 60
Registrovaný: 27 máj 2015, 15:40

Re: Ako citat vstup, kym nenastane EOF

Príspevok od používateľa Oblak »

marek788 napísal: edit2: takze robi to to, ze ten asdf retazec nezobere cely naraz, ale bere to len po jeden znak, cize nacita len acko, tym padom scanf vrati 1cku a nesplni sa podmienka, potom to iste s skom,deckom a efkom, tym padom 4x nespravny vstup. Viem to nejak osetrit? Nic ma nenapada.
Ja by som to spravil takto:

Kód: Vybrať všetko

  
   int a = 0; //
   while ((c1=(scanf(" %c %lf %c %lf %c", &f, &cx, &g, &cy, &h))) != EOF){

   if (c1 != 5 || h != ']' || g != ',' || f != '['){
            ++a; //
            if (a == 1) //
                   printf("Nespravny vstup. \n");
            continue;
        }
        a = 0; //
        
        for (int i = 0; i < pocet; i++) {
            u = polex[i] - cx;
            v = poley[i] - cy;
            
            vysledok = sqrt((u*u) + (v*v));
            if (vysledok>max){
                max = vysledok;
            }
            
        }
        printf("Max: %g\n", max);
        max = 0;
    }
// oznacujem co som pridal.
Napísať odpoveď