Zatrzymanie funkcji przy petli while

0

Mam taki kod funkcji:

void gameFunc(char *tab,int gamer){
  int botNumber=bot(tab);
  int c;
  if(gamer==0){
    while((c>0 && c<10)||(c=='q'||c=='Q')){
      scanf("%i",&c);
      if(c=='q'||c=='Q')
	exit(0);
      else if((c>0 && c<10) && (tab[c]!='O' || tab[c]!='X'))
	tab[c-1]='O';
    }
    while(tab[botNumber]!='X'||tab[botNumber]!='O'){
      if(tab[botNumber]!='X'&&tab[botNumber]!='O')
	tab[botNumber-1]='X';
      else
	botNumber=rand()%9;
    }
  }
  if(gamer==1){
    while(tab[botNumber]!='X'||tab[botNumber]!='O'){
      if(tab[botNumber]!='X'&&tab[botNumber]!='O')
	tab[botNumber-1]='O';
      else
	botNumber=rand()%9;
    }
    while((c>0 && c<10)||(c=='q'||c=='Q')){
      scanf("%i",&c);
      if(c=='q'||c=='Q')
	exit(0);
      else if((c>0 && c<10) && (tab[c]!='O' || tab[c]!='X'))
	tab[c-1]='X';
    }
    while(tab[botNumber]!='X'||tab[botNumber]!='O'){
      if(tab[botNumber]!='X'&&tab[botNumber]!='O')
	tab[botNumber-1]='O';
      else
	botNumber=rand()%9;
    }
  }

i program zatrzymuje mi sie na wejsciu do tej funkcji, na scanf'ie, co tu jest nie tak ? petla while ? Bo chce zeby sie wykonywalo to co jest w niej dopuki uzytkownik nie poda liczby 1-9 albo Q,q, cos zle tam napisalem ?

0

Znak z klawiatury 0...9 wcale nie jest równy wartości 0...9. Zapoznaj się z tablicą ASCII. Ten znak co pobierasz ma odpowiadającą mu wartość właśnie w tej tablicy :)

0

a najlepiej użyj isdigit z ctype.h

2

co tu jest nie tak ?

Cały ten kod.
Beznadziejne formatowanie, magiczne nazwy i więcej beznadziejnego formatowania.

1

@Patryk27 to moze powiedz jak lepiej napisac a nie tylko piszesz ze jest zle z tym formatowaniem.A co do nazw, jak nie rozumiesz angielskiego odsylam do slownika, wtedy przestana byc takie magiczne :)
@Proxima a jak przy isdigit sprawdzac czy jest to liczba z przedzialu 1-9 ?

0
    #include <stdio.h>
#include <stdlib.h>

int main(void) {
	char input[3];
	int num = 0;
	while(num < 1 || num > 9) {
		printf("Give num between 1-9");
		scanf("%s", input);
		if(input[0] == 'q' || input[0] == 'Q')
			return 0;
		num = atoi(input);
	}
	printf("Elo");
	return 0;
}
  1. Czytasz z wejścia jeden znak - więc nie dało się podać liczby większej niż 9 - zmieniłem na to że wczytujesz ciąg znaków(max 2 znaki + znak końca)
  2. Skoro kończysz pracę po wczytaniu q lub Q nie potrzebujesz tego w warunku pętli
  3. Wczytujesz znak ASCII a porównujesz jak liczbę - musisz zastosować atoi(zamienia liczbę w stringu na int)
  4. Przed wejściem w pętle Twoje c było niezdefiniowane, jeżeli wcześniej w tym miejscu w pamięci była liczba np. 1 pętla mogła nigdy się nie wykonać.
  5. Pochrzaniłeś warunek w pętli.
0

Użyj dokumentacji młody padawanie, a wszystko stanie się jasne.
I zdecyduj się czy chcesz wczytywać znaki ASCII czy liczby, bo to spora różnica, mniej więcej o jakieś 48.

0

Dzieki pando : )

0

ale niestety dalej nie dziala

int gameFunc(char *tab,int gamer){
  int botNumber=bot(tab);
  int c;
  if(gamer==0){
    while((c<9 && c>9)||(c=='q'||c=='Q')){
      scanf("%i",&c);
      if(c=='q'||c=='Q')
	return 1;
      else if((c<1 && c>9) && (tab[c]!='O' || tab[c]!='X'))
	tab[c-1]='O';
    }
    while(tab[botNumber]!='X'||tab[botNumber]!='O'){
      if(tab[botNumber]!='X'&&tab[botNumber]!='O')
	tab[botNumber-1]='X';
      else
	botNumber=rand()%9;
    }
  }
  if(gamer==1){
    while(tab[botNumber]!='X'||tab[botNumber]!='O'){
      if(tab[botNumber]!='X'&&tab[botNumber]!='O')
	tab[botNumber-1]='O';
      else
	botNumber=rand()%9;
    }
    while((c<1 && c>9)||(c=='q'||c=='Q')){
      scanf("%i",&c);
      if(c=='q'||c=='Q')
	exit(0);
      else if((c<1 && c>9) && (tab[c]!='O' || tab[c]!='X'))
	tab[c-1]='X';
    }
  }
  return 0;
}

poza tym nie wiem po co do tak prostej operacji uzywac i zmiennej i tablicy...

1

autorze:

  • uzywasz formatowania dla inta %i a chcesz wczytac znak... http://www.cplusplus.com/reference/cstdio/scanf/
  • uzywasz copy-paste co jest kompletna porazka, umiesz tworzyc funkcje a kopiujesz cale bloki jak jakas krysia z hr'ow
  • jak zadajesz pytanie i dostajesz rady to w zdecydowanej czesci ludzie chca ci pomoc, okaz troche szacunku i wez zmien ten kod tak jak zalecaja, moze ci to wyjsc tylko na dobre
0

Nie chce wczytac znaku, chce wczytac albo znak albo liczbe, uzytkownik ma podac albo liczbe od 1 do 9 albo znak Q lub q, jak to zrobic ??

1

Wczytaj znak ;-)
Nie no, a tak serio, gdybyś chociaż rzucił okiem na tablice ASCII nie zadawał byś takich pytań.
spróbuj tak

char c;
scanf("%i", &c);
scanf("%c", &c);

I wypisz sobie c.
Powinieneś zauważyć różnicę.

0
char c;
  while(c<'1' || c>'9'){
      scanf("%c",&c);
      return 2;
      if(c=='q'||c=='Q')
	return 1;
      else if(tab[c]!='O' || tab[c]!='X')
	tab[c-1]='O';
  

W takim ukladzie dziala nawet dobrze, tylko ze problem z indeksem tablicy, ze jest znakiem, jak zmienic ten char na inta zeby byl taki jak uzytkownik podal zeby mozna bylo to dac jako indeks tablicy ?
W takim ukladzie dziala dobrze

1
int num = c-'0';
0
  char c;
  int num=c-'0';
  if(gamer==0){
    while(c<'1' || c>'9'){
    scanf("%c",&c);
      if(c=='q'||c=='Q')
	return 1;
      else if(tab[num]!='O' || tab[num]!='X')
	tab[num-1]='O';

nie dziala dobrze

0

Bo zupełnie nie rozumiesz co robisz.
Jeśli odejmiesz od c '0', czyli 48, musisz porównac to jak inta.
Widze że dalej nie spojrzałeś na tablice ASCII, i mam wrażenie że trollujesz ;f
// edit
No jak konwertujesz jeden raz przed pętlą to sie nie dziw że nie działa ;D

0

Widze ze ty trollujesz, kalex podala mi ten kod, mowie ze nie dziala, no program ciagle zasuwa funkcje ktora jest przed ta ktora tu jest napisana,

0
  char c;
  if(gamer==0){
    while(c<'1' || c>'9'){
      scanf("%c",&c);
      int num=c-'0';
      if(c=='q'||c=='Q')
	return 1;
      else if(tab[num]!='O' || tab[num]!='X')
	tab[num-1]='O';

teraz jest tak

0

dobra dzialajacy kod:

    while(c<'1' || c>'9'){
      scanf(" %c",&c);
      int num=c-'0'-1;
      if(c=='q'||c=='Q')
	exit(0);
      else if(tab[num]!='O' || tab[num]!='X')
	tab[num]='O';
    }

trzeba bylo w scanf przed %c dac spacje zeby scanf je ignorowal bo jak wpisywalem numer i znak nowej linii nawelem enterem to funkcja sie gubila bo num bylo zawsze wartosci -39

1 użytkowników online, w tym zalogowanych: 0, gości: 1