Hirdetés

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

  • Jester01
    veterán

    Üdv!

    A következő kóddal (mintakód, de a problémám ugyanez) lenne a problémám:
    int i;
    scanf("%d",&i);
    printf("%d",i); //nem integer esetén 0
    while(i==0)
    {
    printf("Nem jó. Új szám: ");
    scanf("%d",&i);
    }
    printf("%d",i);

    Amíg az i-nek számot adok meg, nincs gond, de amint betűt, a mögötte lévő ciklus végtelen ciklusba kerül. Ezt próbáltam meg kiküszöbölni a példában szereplő while ciklussal ami megnézi, hogy 0-e, mivel nem szám esetében 0 lesz az i értéke, de az is végtelen ciklusba kerül. Hogy tudom elérni, hogy nem szám beírásakor újrakérje a számot végtelen ciklusok helyett?
    Az int-et nem módosíthatom karakterre, főleg nem karaktertömbre, az most túl bonyolult lenne a program többi része miatt.
    Van valami megoldás erre? Egyáltalán miért nem működik? Ha az i értéke 0 lesz, akkor a while miért hülyül meg, mi a különbség 0 és 0 közt, ha mindkettő integer?

    Az i nem feltélten lesz 0. Egyszerűen csak nem változik az értéke. Mivel te semmivel sem inicializáltad, véletlen érték lesz, ami éppen a memóriában volt. Feladattól függően egyébként sem biztos, hogy a 0 hibás bevitel lenne.

    Azért végtelen a ciklus mert ha a scanf elakad, akkor nem olvassa ki a pufferből a maradékot. A következő scanf hívás tehát pont ugyanúgy elakad. Neked kell takarítani, a következő sorvég jelig, például getchar használatával. EOF-ot is illik lekezelni.

    A scanf amúgy visszaadja mennyi mezőt sikerült beolvasnia, de ettől még lehet szemét a pufferben. Nem véletlenül mondják, hogy nem ajánlott scanf-et használni. Bármennyire is nem szeretnéd, a korrekt megoldás általában teljes sor olvasása (fgets) után kézi feldolgozás (strtol, strtod).

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