Osetreni vstupu

Místo pro dotazy a rady ohledně programovacích jazyků (C++, C#, PHP, ASP, Javascript, VBS..) a tvorby webových stránek

Moderátor: Mods_senior

fuchsis
nováček
Příspěvky: 6
Registrován: říjen 12
Pohlaví: Nespecifikováno
Stav:
Offline

Osetreni vstupu

Příspěvekod fuchsis » 13 říj 2012 22:58

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 ?

Reklama
Uživatelský avatar
domitea
Tvůrce článků
Level 4.5
Level 4.5
Příspěvky: 1971
Registrován: červen 09
Bydliště: Královehradecký kraj
Pohlaví: Muž
Stav:
Offline
Kontakt:

Re: Osetreni vstupu

Příspěvekod domitea » 14 říj 2012 09:44

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 ?
Naposledy upravil(a) domitea dne 14 říj 2012 11:54, celkem upraveno 2 x.

Uživatelský avatar
faraon
Master Level 8.5
Master Level 8.5
Příspěvky: 7397
Registrován: prosinec 10
Pohlaví: Muž
Stav:
Offline

Re: Osetreni vstupu

Příspěvekod faraon » 14 říj 2012 10:06

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!
"Král Lávra má dlouhé oslí uši, král je ušatec!

(pravil K. H. Borovský o cenzuře internetu)

fuchsis
nováček
Příspěvky: 6
Registrován: říjen 12
Pohlaví: Nespecifikováno
Stav:
Offline

Re: Osetreni vstupu

Příspěvekod fuchsis » 14 říj 2012 10:43

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.

Uživatelský avatar
faraon
Master Level 8.5
Master Level 8.5
Příspěvky: 7397
Registrován: prosinec 10
Pohlaví: Muž
Stav:
Offline

Re: Osetreni vstupu

Příspěvekod faraon » 14 říj 2012 11:06

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é.
"Král Lávra má dlouhé oslí uši, král je ušatec!

(pravil K. H. Borovský o cenzuře internetu)

fuchsis
nováček
Příspěvky: 6
Registrován: říjen 12
Pohlaví: Nespecifikováno
Stav:
Offline

Re: Osetreni vstupu

Příspěvekod fuchsis » 14 říj 2012 11:44

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 ?

Uživatelský avatar
faraon
Master Level 8.5
Master Level 8.5
Příspěvky: 7397
Registrován: prosinec 10
Pohlaví: Muž
Stav:
Offline

Re: Osetreni vstupu

Příspěvekod faraon » 14 říj 2012 11:51

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? ;-)
"Král Lávra má dlouhé oslí uši, král je ušatec!

(pravil K. H. Borovský o cenzuře internetu)

fuchsis
nováček
Příspěvky: 6
Registrován: říjen 12
Pohlaví: Nespecifikováno
Stav:
Offline

Re: Osetreni vstupu

Příspěvekod fuchsis » 14 říj 2012 12:21

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.

Uživatelský avatar
faraon
Master Level 8.5
Master Level 8.5
Příspěvky: 7397
Registrován: prosinec 10
Pohlaví: Muž
Stav:
Offline

Re: Osetreni vstupu

Příspěvekod faraon » 14 říj 2012 13:03

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.
"Král Lávra má dlouhé oslí uši, král je ušatec!

(pravil K. H. Borovský o cenzuře internetu)

fuchsis
nováček
Příspěvky: 6
Registrován: říjen 12
Pohlaví: Nespecifikováno
Stav:
Offline

Re: Osetreni vstupu

Příspěvekod fuchsis » 14 říj 2012 14:02

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 :).

Uživatelský avatar
faraon
Master Level 8.5
Master Level 8.5
Příspěvky: 7397
Registrován: prosinec 10
Pohlaví: Muž
Stav:
Offline

Re: Osetreni vstupu

Příspěvekod faraon » 14 říj 2012 14:09

Na takové experimenty bacha :lol:

Obrázek
"Král Lávra má dlouhé oslí uši, král je ušatec!

(pravil K. H. Borovský o cenzuře internetu)

fuchsis
nováček
Příspěvky: 6
Registrován: říjen 12
Pohlaví: Nespecifikováno
Stav:
Offline

Re: Osetreni vstupu

Příspěvekod fuchsis » 14 říj 2012 14:42

: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 :)
Naposledy upravil(a) fuchsis dne 14 říj 2012 15:13, celkem upraveno 1 x.


Zpět na “Programování a tvorba webu”

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 5 hostů