C - zignorowanie niepoprawnych danych, powtórzenie odczytu


(Copycona) #1

Mam przykładowo taki kod:

#include

(Rolek0) #2
#include 


int main()

{

        int x, r;

        for(;;)

        {

                r = scanf(" %d", &x);

                if(r == 1 && x > 0)

                        break;

                else if(r == 0)

                        scanf(" %*s");

                else if(r == EOF)

                        /*koniec wejścia*/;

        }

        printf("%d", x);

        return 0;

}

(Copycona) #3

Hm, wygląda nieźle. Dzięki.

Mam jeszcze takie pytanie:

r = scanf(" %d", &x);scanf(" %*s");[/code]Ta spacja (przed znakiem procent) tam widnieje w jakimś konkretnym celu?

(Rolek0) #4

W celu zignorowania białych znaków na wejściu jeśli jakieś są. W większości implementacji i tak są ignorowane, ale przezorny zawsze ubezpieczony :wink:


([alex]) #5

Rolek0, czy zdajesz sobie sprawy co tym robisz?

scanf(" %*s");

wczytujesz nieokreśloną ilość znaków w nieokreślony adres pamięci.

Natomiast to:

scanf(" %d", &x);

pod jednym kompilatorem zadziała pod innym nie.

Np: scanf(".%d", &x); - pominie białe znaki, sprawdzi czy następny znak to ‘.’, pominie białe znaki, wczyta x

natomiast użycie białych znaków w formacie scanf nie jest zdefiniowane.

scanf domyślne pomija białe znaki, nie trzeba nić z tym robić.


(Copycona) #6
#include

([alex]) #7

A jak będzie podano więcej niż 31 znak? Lub dwa słowa?

zamiast scanf("%31s", buffr); użyj:

while(getchar()!=’\n’) {}


(Rolek0) #8

Ja zdaję. A czy ty zdajesz sobie sprawę, że * oznacza, że dane zostaną odczytane ale nie zostaną nigdzie zapisane? :wink:

To będzie ignorować po kawałku :stuck_out_tongue: