关于主要功能中的scanf问题的问题

时间:2019-06-10 09:44:37

标签: c scanf

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");
}

我在c的主要函数中遇到scanf函数的奇怪问题。如您所见,我在while循环中包含了两个scanf函数。在循环的每次迭代中,只有第一个scanf函数将运行,而第二个则被完全跳过。可能是什么问题?任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

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,第二个特定于每个键。这可能是另一个惊奇的来源。


当密钥不是预期的密钥之一时,您无法正确处理这种情况。在这种情况下,应跳过整个代码块,然后重新启动循环。