Вопрос о проблеме scanf в основной функции - PullRequest
0 голосов
/ 10 июня 2019
int main(int argc, char *argv[]){
  //introduction
  printf("WELCOME TO PENTAGO!!!\n\n");
  int size = atoi(argv[2]);
  game* g = new_game(size, CELLS);
  printf("PENTAGO Board: (. : Empty, * : Black, 0 : White)\n");
  board_show(g->b);

  while(1){
    if(g->next == WHITE_NEXT){
      printf("White: \n");
    }
    if(g->next == BLACK_NEXT){
      printf("Black: \n");
    }
    //move
    //place marble;
    char move;
    printf("Please enter a move: ");
    scanf(" %c", &move);
    char a1 = move;   move++;   char a2 = move;
    pos p = make_pos(charToInt(a1),charToInt(a2));
    place_marble(g,p);
    board_show(g->b);

    //twist quadrant;
    printf("\nTo twist please enter quadrant q (1 : NW, 2 : NE,3 : SW,4 : SE) and direction d (c : clockwise, w: counterclockwise) in the given format: qd \nFor example 2w indicates a counterclockwise twist in the north east quadrant.");
    char entry;
    printf("Twist Entry: ");
    scanf(" %c", &entry);
    char q1 = entry ; entry++ ; char d1 = entry;
    twist_quadrant(g,charToQuad(q1), charToDir(d1));
    board_show(g->b);
  }

  printf("\n");
}

У меня странная проблема с функцией scanf в моей основной функции в c. Как видите, я включил две функции scanf в свой цикл while. На каждой итерации цикла будет выполняться только первая функция scanf, а вторая полностью пропускается. В чем может быть проблема? Любая помощь будет принята с благодарностью.

1 Ответ

0 голосов
/ 11 июня 2019
scanf(" %c", &move);
scanf(" %c", &entry);

Люди обычно используют getch() для таких случаев.Это более прямо.

char a1 = move;   move++;   char a2 = move;
char q1 = entry ; entry++ ; char d1 = entry;

Это действительно странные вещи.Что вы пытаетесь сделать?

char move;
char entry;

Хорошая практика программирования говорит нам, что переменные должны быть определены только в начале функции.Обычно компиляторы отклоняют определения в середине функции.


Комментарий:

printf ("\ nДля поворота введите квадрант q (1: NW, 2: NE, 3: SW, 4: SE) и направление d (c: по часовой стрелке, w: против часовой стрелки) в заданном формате: qd \ n Например, 2w указываетповорот против часовой стрелки в северо-восточном квадранте. ");

запрашивает использование для предоставления 2 символов, не являющихся пробелами.Один используется вторым scanf() (тот, что сразу после комментария), а другой остается в буфере.Затем он потребляется первым scanf().Вот почему у вас есть «иллюзия», что некоторые scanf() не выполняются.


Какие клавиши вы используете для движения?Некоторые клавиши (например, стрелки) на самом деле генерируют последовательность из 2 символов: первая всегда 0x00, а вторая специфична для каждой клавиши.Это может быть еще одним источником удивления.


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

...