C:函数在代码中跳过用户输入

我遇到了这个function(战舰游戏的一部分)的问题,它将完美地运行它,但在后续的执行中,它会跳过:

scanf("%c",&rChar); 

出于某种原因,rChar在没有上述代码的用户输入的情况下变成另一个值。 我试过在整个函数中输入显示rChar值的printf语句。

函数Conv_rChar_Int()将用户输入的Char转换为整数值。 但是因为rChar没有作为指针传递,所以rChar的值rChar保持不变,直到用户在下一次迭代中替换它。 (再次使用printfvalidation)。 奇怪的是,它在这些代码行之间发生了变化。 并且从不提示用户输入rChar

  printf("please enter the row you want to place your %d ship in\n",length); scanf("%c",&rChar); 

请记住,它只发生在第一次之后。 即使我在每次迭代后重新初始化变量rCharrcdir ,这个问题仍然会发生。 我99%肯定问题是在这个函数内而不是在它内部调用的任何函数中(因为rChar在每一行之后保持不变,除了上面的两行之外)。

提前感谢您的帮助。 如果您对代码有任何疑问,我会尝试解释一下。

 int Gen_Ship_Place(int length, int flag3, int PlayGrid[10][10]){ int ShipPlaceFlag = 0; //coordinates and direction int r; char rChar; int c; int dir; //this loops until a ship location is found while(ShipPlaceFlag == 0) { //enters row printf("please enter the row you want to place your %d ship in\n",length); scanf("%c",&rChar); r = Conv_rChar_Int(rChar); //adjusts row r--; //enter column printf("please enter the column you want to place your %d ship in\n",length); scanf("%d",&c); //adjust column c--; //enter direction printf("please enter the direction you want your %d ship to go\nwith\n0 being north\n1 being east\n2 being south\n3 being west\n",length); scanf("%d",&dir); //checks ship placement ShipPlaceFlag = Check_Ship_Place(length,dir,flag3,r,c,PlayGrid); //tells player if the location is wrong or not if(ShipPlaceFlag == 0) { printf("****the location and direction you have chosen is invalid please choose different coordinates, here is your current board*****\n\n"); } else { printf("****great job, here is your current board*****\n\n"); } //prints grid so player can check it for their next move Print_Play_Grid(PlayGrid); } 

您的程序打印此提示:

 please enter the row you want to place your 2 ship in 

并调用scanf 。 键入5并按回车键。 您输入了两个字符: 5和换行符\n 。 (或者也许它在Windows上是\r 。)该换行符位于输入缓冲区中,直到下一次调用scanf ,它会读取换行符并立即返回,而无需输入更多输入。

通过在%c说明符之前放置一个空格,可以使scanf在读取单个字符时跳过换行符(和其他空格),如下所示:

 scanf(" %c", &c); 

当用户按下回车键时,这也是将在输入缓冲区中的字符。 你需要阅读过去的内容。

 //prints grid so player can check it for their next move Print_Play_Grid(PlayGrid); while (fgetc(stdin)!='\n') { }