Stránka 1 z 2

Osetreni vstupu

Napsal: 13 říj 2012 22:58
od fuchsis
Cau.
Snazim se vytvorit program v C, ale zasekl jsem se hned u osetreni vstupu. Do vstupu by mela prijit dve cisla oddelena dvojteckou - vstup = a:b.
Chtel sem na to jit s pomoci tohoto : if scanf("%d",&a) != 1 printf ("chyba"), coz jsem posleze poupravil tak aby to schramstlo i promennou b : if scanf("%d:%d", &a, &b) != 2 printf ("chyba"). Coz nefungovalo. V Ccku jsem novacek a snazim se vyhnout superpokrocilejm funkcim kterym nerozumim. Nepomohl by nekdo prosim ?

Re: Osetreni vstupu

Napsal: 14 říj 2012 09:44
od domitea
Co takhle zkusit try a catch? Neboli zkus příkaz jinak chyť chybu :wink:

Kód: Vybrat vše

try
{
scanf("%i:%i", &a, &b);
}
catch
{
printf("chyba");
}


EDIT:V Céčku tohle nejede, ale přitom v Pythonu to jde :lol: . Dík za opravu :wink:

Jestli to je ANSI C, tak by to mělo jít.
Jinak:


Zajímá tenhle kus kódu:

Kód: Vybrat vše

if scanf("%d:%d", &a, &b) != 2



Jak jsi přišel na tu dvojku, resp. jedničku ?

Re: Osetreni vstupu

Napsal: 14 říj 2012 10:06
od faraon
Try a catch nezkoušej, to je C++ ;-)

V Céčku se všechno řeší přes návratové hodnoty, neboli "udělej to a řekni mi jak to dopadlo". Ty tam správně testuješ, jestli ten scanf() načetl nějaké číslo, ale už neřešíš problém - jak odstranit překážku, která mu v tom brání.

Můžeš to udělat třeba takhle - "dokud není načteno číslo, vyhoď jeden znak ze vstupního bufferu":

Kód: Vybrat vše

while (!scanf("%d",&a)
      getchar();


Když načteš číslo hned napoprvé, tak se nic nevyhazuje.
Musíš ale každé číslo načítat zvlášť, ne víc najednou!

Re: Osetreni vstupu

Napsal: 14 říj 2012 10:43
od fuchsis
kazde cislo zvlast ? :/ potrebuju tam hodit dve cisla najednou, oddelena dvojteckou. Zkusim si s tim nejak pohrat. Jinak sem zjistil ze muj predchozi kod jakztakz funguje, jen sem tam zapomnel hodit zavorky.

Kód: Vybrat vše

if ((scanf("%d:%d",&a, &b) != 2)

Ma to jedinou chybku, pokud zadam do prvniho vstupu neplatny znak (treba abc:86, nebo treba i abc:klm), vyhodi mi to na vystup uspesny vstup, a az potom chybny. Coz je celkem vazna chyba, nejspis to pres pocet konverzi nepujde. Podivam se jeste na to getchar.

Re: Osetreni vstupu

Napsal: 14 říj 2012 11:06
od faraon
Potřebuješ tam načíst dvě čísla, takže třeba takhle ;-)

Kód: Vybrat vše

while (!scanf("%d",&a)
      getchar();
while (!scanf("%d",&b)
      getchar();


Tím ošetříš i ten neplatný znak na prvním vstupu, a bude ti jedno jestli jsou čísla oddělená dvojtečkou, čárkou, mezerou nebo čímkoliv jiným...

Nebyl by problém udělat to jako funkci nebo makro, abys to pokaždé nemusel vypisovat celé.

Re: Osetreni vstupu

Napsal: 14 říj 2012 11:44
od fuchsis
Hm kompilatoru se to nelibi, pise unexpected token :; u getcharu. Kdyz hodim strednik za while tak si to zase stezuje na token. Neni mi ani prilis jasne co s tim. Muzu se jeste zeptat jak by to melo presne vypadat ?

Re: Osetreni vstupu

Napsal: 14 říj 2012 11:51
od faraon
Sakra, to je tím že jsem to psal přímo sem, a ne v Geditu, ten by mě varoval. Zapni si zvýrazňování párů závorek, ať neděláš tak blbé chyby jako jsem teď udělal já! Mělo to být takhle:

while (!scanf("%d",&a))

Když už jsem uzavřel závorku toho scanf(), tak je také potřeba uzavřít while(), ne? ;-)

Re: Osetreni vstupu

Napsal: 14 říj 2012 12:21
od fuchsis
S tema zavorkama jsou vzdycky sileny problemy :D
Tak uz mam tedy neco co vypada takhle :

Kód: Vybrat vše

int main (void){
    int a =  0, b = 0;
     printf("Vstup x:y, pouze cisla\n");
while (!scanf("%d",&x))
      getchar();
      printf ("uspech");
while (!scanf("%d",&y))
      getchar();
      printf ("uspech");
  system ("pause");
  return 0;
}

Za kazdy ciselny vstup mi to napise uspech, pokud tam zadam spatny vstup tak to nenapise vubec nic a klidne pokracuje dal. To porad neni uplne ono. Moc se omlouvam za tyto zacatecnicke dotazy. Potreboval bych aby to vypsalo hlasku "spatne" pokud tam zadam jakykoliv neciselny znak v jakemkoliv formatu, a hlasku "dobre" pouze kdyz tam zadam dve cisla oddelena dvojteckou, ktera jeste pozdeji osetrim proti zapornym hodnotam. Chtelo by to do toho kodu implementovat par IFu ale nemam tuseni jak.

--- Doplnění předchozího příspěvku (14 Říj 2012 12:48) ---

Tak nic uz jsem to asi vyresil.

Kód: Vybrat vše

int main (void){
    int x =  0, y = 0;
     printf("Vstup x:y, pouze cisla\n");
while (scanf("%d",&x))
      getchar();
      goto label1;
while (scanf("%d",&y))
      getchar();
      goto label1;
      label1:
             printf ("neuspech");
  system ("pause");
  return 0;
}

Chtel bych vsem mockrat podekovat za pomoc, hlavne faraonovi :)
Jeste si pohraju se zapornejma hodnotama ale to snad nejak pujde.

Re: Osetreni vstupu

Napsal: 14 říj 2012 13:03
od faraon
Máš tam proměnné a,b, ale načítáš do x,y :shock:

Co třeba takhle nějak?

Kód: Vybrat vše

if (scanf("%d",&a) && a>=0)
   if (getchar()==':')
      if (scanf("%d",&b) && b>=0)
         /* pokud ses dostal až sem, všechno se načetlo dobře */
      else
         /* chyba v druhém čísle */
   else
      /* chyba ve dvojtečce */
else
   /* chyba v prvním čísle */


Ošetřil jsem tam i ta záporná čísla.
Ty chyby si můžeš řešit jak chceš, každou zvlášť, nebo si nastavit nějaký flag a podle něj pak vypsat výsledek až následně...

P.S. Na to že existuje nějaké GOTO rychle zapomeň, a vyhni se jeho použití přinejmenším do doby, než budeš psát programy dlouhé aspoň 10000 řádků!!! Tohle se dělalo v historickém FORTRANu nebo BASICu, ale ve strukturovaném programování jsou na to vždy čistší způsoby.

Re: Osetreni vstupu

Napsal: 14 říj 2012 14:02
od fuchsis
Jo ja tu mam dva zdrojaky v jednom pracuju s a,b a v druhym s x,b takze se mi to plete :D, srovnam si to tu radsi, clovek nikdy nevi kdy udela chybu.
Ok, goto pouzivat nebudu, to byl spis stejne jen takovej experiment.
Jinak to funguje skvele, mockrat dekuju :).

Re: Osetreni vstupu

Napsal: 14 říj 2012 14:09
od faraon
Na takové experimenty bacha :lol:

Obrázek

Re: Osetreni vstupu

Napsal: 14 říj 2012 14:42
od fuchsis
:D
Jenom jeste, ciste ze zvedavosti, je nejaka moznost napojit vsechny IFy na jeden ELSE, abych tam mel jen jeden typ chybove hlasky ? momentalne bych tam mel tri stejne printfy pod sebou, za coz by me asi nikdo nepochvalil. Zkousel sem toto, ale dostal sem se k programku, ktery me odmeni pouze vystupem "chyba" at uz to mam sebespravneji :D

Kód: Vybrat vše

if ((scanf("%d",&a)) && a>=0 && (scanf("%d",&b)) && b>=0 && (getchar()==':'))
         printf ("dobre");
else
   printf ("chyba");


Tak nic, uz sem to spravil. Nevim vubec jak, asi sem tam hodil nejakou chybu ale ted to zcela zahadne zacalo brat i spravne vstupy. Jeste jednou dik faraone :)