首页 > 解决方案 > 关于main函数中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 中的 main 函数中遇到了一个奇怪的问题,即 scanf 函数。如您所见,我在 while 循环中包含了两个 scanf 函数。通过循环的每次迭代,只有第一个 scanf 函数会运行,而第二个函数会被完全跳过。可能是什么问题?任何帮助将不胜感激。

标签: cscanf

解决方案


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


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


推荐阅读