[C] zabezpieczanie scafnów


(master of disaster) #1

Witam, piszę program w C gdzie jest dużo scafnów, i wszystkie z nich pobierają tylko i wyłącznie cyfry z jakiegoś zakresu np. 1-4.

Napisałem funkcje która sprawdza czy scanf pobrał CYFRĘ z danego zakresu:

int check(int a, int b) {
        int i=1;
        int result=0;
        for(i=1 ; i<=b ; i++) {
                if(a==i) {
                        result=1;
                }
        }
        return result;
}
...main...

      scanf("%d",&c);                                                                                   
      while(1) {
      if(!check(c,3)){
      printf("Zly wybor, sproboj jeszcze raz:\n"); scanf("%d",&c);
      }
      else break;
 }

Gdzie   a  to wpisana liczba na wejście, a  to zakres.

I w sumie działa fajnie, ale problem polega na tym, że jak wpisze coś innego niż cyfrę, np literę, to zapętla sie WHILE wypisując ciągle printf'a "zły wybór...". Dlaczego, i jak to naprawić?

 

Pozdrawiam


(Drobok) #2

Pobierając liczbę masz nieokreśloną wartość. Powinieneś pobierać znak (%c zamiast %d) i wtedy go przerobić na liczbę


(master of disaster) #3

Możesz troszkę jaśniej? Najlepiej na jakimś przykładzie :slight_smile:

%c to char, zgadza się? Na charach nie moge wykonywać operacji arytmetycznych tak?

Wiec pobieram chara, wtedy sprawdzam w ten sam sposób (?) czy jest CYFRĄ z zakresu, a poźniej zamieniam go na int’a, (jak?)

 

Pozdraiwm

 

EDIT: dodając w pętli getchar(); pozbyłem się tego problemu. Już jest prawie dobrze, jednak gdy wpiszę np. a1 (znak i liczbe z zakresu) to przechodzi dalej, po kilku pustych przejsciach petli…


(Drobok) #4

Zapomniałem o \n, za dużo strumieni, trzeba skorzystać z %s i tablicy charów :stuck_out_tongue:

#include <stdlib.h>
 
int main() {
  char c[255];
  while(atoi(c)==0)
    scanf("%s",&c);
  printf("%d",atoi(c));
return 0;
}

(master of disaster) #5
warning: format '%s' expects argument of type 'char *', but argument 2 has type 'char (*)[255]' [-Wformat]

Dodatkowo w Dev C++ wszystko działa ok, a na odpalam na linuxie to omija mi poszczegolne scanfy…


(Drobok) #6

No tak, w końcu to tablica :arrow: bez & w scanf ma być :wink:

Błędy na linuxie mogą być tym właśnie spowodowane. Jeśli dalej nie będzie działało to daj znać. 

Jeśli to nic nie da użyj rozwiązania: http://stackoverflow.com/questions/14099473/how-to-scanf-only-integer-and-repeat-reading-if-the-user-enter-non-numeric-chara