Hirdetés

Új hozzászólás Aktív témák

  • Jester01
    veterán

    Sziasztok,

    újra gondom van, pontosabban egy régi dolog jött fel újra.
    Egyszerű a feladat: 1 és 5 közötti számokat kell beolvasnom. Azt gondoltam, hogy megoldom ezzel:

    #include <stdio.h>


    int main() {

    int i;

    do
    {
    printf("Adjon meg egy szamot 1 es 5 kozott:\n");
    scanf("%d", i);
    fflush(stdin);

    if ((1>i) || (5<i)) printf("A megadott adat nem 1 es 5 kozotti szam.\n");

    } while ((1>i) || (5<i));

    printf("A megadott szam: %d\n", i);

    return 0;
    }

    A program megy, ha mondjuk 4-et ütök be. Működik akkor is, ha mondjuk 44-et ütök: kiírja, hogy hibás és újra kéri. De ha nem számot ütök be, hanem mondjuk egy k betűt, akkor végtelen ciklusban elkezdi kiírni, hogy "Adjon meg egy szamot 1 es 5 kozott:
    A megadott adat nem 1 es 5 kozotti szam." ,

    Mindezt beolvasás nélkül, hiába az fflush.

    Kérdés, hogy mit nézek el? Hogyan kell normálisan bekérni 1 és 5 közötti számokat?

    A beolvasás egyszerű feladatnak tűnik, mégis meglepően bonyolult jól csinálni.

    Az fflush(stdin) nem szabványos, vagy működik vagy nem. Az ajánlott módszer teljes sorok olvasása fgets használatával, majd a beolvasott sor számmá alakítása strtol segítségével. A helyes megoldás a sor olvasásnál kezeli a túl hosszú sorokat, és az átalakítás után ellenőrzi, hogy maradt-e még feldogozatlan karakter.

    Ennél egyszerűbb megoldás, ha az fflush(stdin) helyett egy fgetc(stdin) ciklussal kiolvasol mindent a sor (vagy a bemenet) végéig.

    Az is rossz a kódban, hogy a scanf visszatérési értékét nem ellenőrzöd. Ha ugyanis nem számot írnak be, akkor nem tud mit konvertálni és az i értéke változatlan marad. Azt pedig nem is inicializáltad, tehát bármi lehet. Ha véletlenül 1 és 5 közé esik akkor a programod kilép a ciklusból.

Új hozzászólás Aktív témák