C пока не останавливается - PullRequest
0 голосов
/ 03 мая 2018

Я просто не могу понять, почему это пока не останавливается:

int **movePlayer(int playerI,int playerJ,int length,int ***tab)
{
char letter;
int l;
int c =0;
int verif = 0;
int number;
//int c= 0;
while( verif == 0){
    //fflush(stdin);
    printf("Entrez la lettre correspondante à la colonne sur laquelle vous voulez jouer\n");
    scanf(" %c", &letter);
    //fflush(stdin);
    printf("Entrez le chiffre correspondante à la ligne sur laquelle vous voulez jouer\n");
    scanf(" %d", &number);
    verif = verifScan(playerI,playerJ,letter,number,tab,length);
    printf("%d", verif);
    verif = 1;
}
l = (int)letter - 65;
(*tab)[playerI][playerJ] = 'j' ;
(*tab)[number][l] = 'J';
}

И я уточняю, что последний printf of Verified возвращает 1, потому что моя функция verifyScan возвращает здесь 1.

verifyScan здесь и возвращает 1, когда я пишу B и 0 в моем scanf:

int verifScan(int posI,int posJ,int letter, int number,int ***tab,int     length)
{
   int l;
   if(letter >= 97 && letter <= 97 + length - 1){
      l = letter - 97;
      //return 1;
   } else if(letter >= 65 && letter <= 65 + length - 1){
      l = letter - 65;
      //return 1;
   }else {
      return 0;
   }
   if(number > length - 1 || number < 0){
      return 0;
   }
   if(verifCaseLibre(tab,l,number) == 0){
      return 0;
   }

   if((abs(l - posJ) == 0 && abs(number - posI) == 1) || (abs(l - posJ) == 1 && abs(number - posI) == 0))
   {
      return 1;
   }

   return 1;
}

Я признаю, что у меня много предупреждений

Можно мне помочь, пожалуйста? Спасибо.

Ответы [ 2 ]

0 голосов
/ 04 мая 2018

Извините, проблема, наконец, заключалась в том, что я дважды вызывал функцию, поэтому время было инициализировано дважды. Спасибо всем за помощь.

0 голосов
/ 03 мая 2018

Задача 1

fflush предназначен для использования с выходными потоками, а не с входными потоками. Использование fflush(stdin) не правильно. От http://en.cppreference.com/w/c/io/fflush:

Для входных потоков (и для потоков обновления, для которых была введена последняя операция), поведение не определено.

Если вы хотите игнорировать все до конца строки, вы можете использовать:

 int c;
 while ( (c = getc(stdin)) != '\n' && c != EOF);

Я рекомендую поместить это в функцию и вызвать функцию.

 void ignoreLine(FILE* fp)
 {
    int c;
    while ( (c = getc(fp)) != '\n' && c != EOF);
 }

и затем используйте

 ignoreLine(stdin);

Задача 2

Использование "%c" в спецификаторе формата вызова scanf не будет пропускать пробелы. Если вы хотите пропустить пробелы, используйте " %c".

  scanf(" %c", &letter);

Вероятно, ваша проблема проистекает из комбинации двух вышеупомянутых.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...