我遇到了这个功能(战舰游戏的一部分)的问题,它会完美地运行它,但在随后的执行中,它会跳过:
scanf("%c",&rChar);
出于某种原因,rChar在没有上述代码的用户输入的情况下变成另一个值。
我已尝试在整个函数中输入显示rChar值的printf
语句。
函数Conv_rChar_Int()
将用户输入的Char转换为整数值。但是因为rChar
没有作为指针传递,所以rChar
的值始终保持不变,直到用户在下一次迭代中替换它。 (已使用printf
再次验证)。奇怪的是,它在这些代码行之间发生了变化。并且永远不会提示用户rChar
。
printf("please enter the row you want to place your %d ship in\n",length);
scanf("%c",&rChar);
请记住,它只会在第一次发生之后发生。即使我在每次迭代后重新初始化变量rChar
,r
,c
和dir
,这个问题仍然会发生。
我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);
}
答案 0 :(得分:4)
您的程序会打印此提示:
please enter the row you want to place your 2 ship in
并致电scanf
。您输入5
并按回车键。您输入了两个字符:5
和换行符\n
。 (或者也许它在Windows上是\r
。)换行符位于输入缓冲区中,直到下一次调用scanf
,它会读取换行符并立即返回,而无需输入更多输入。< / p>
通过在scanf
说明符前加一个空格,可以让%c
在读取单个字符时跳过换行符(和其他空格),如下所示:
scanf(" %c", &c);
答案 1 :(得分:1)
当用户按下回车键时,这也是将在输入缓冲区中的字符。你需要阅读过去。
//prints grid so player can check it for their next move
Print_Play_Grid(PlayGrid);
while (fgetc(stdin)!='\n') { }