我有一个c功能:
void getInput(int turn)
{
int posI, posII, i, j;
char posC, c;
if(turn == 1)
{
c = 'B';
}
else if(turn == 2)
{
c = 'W';
}
int count = 0;
while(1)
{
printf("Enter the Cell:\n");
count++;
printf("I'm Here %d", count);
scanf("%c%d", &posC, &posI);
posII = (int)posC - (int)'A';
posI = posI - 1;
if(board[posII][posI] == '*')
{
board[posII][posI] = c;
for(i = 0 ; i < 8 ; i++)
for(j = 0 ; j < 8 ; j++)
{
if(board[i][j] == '*')
board[i][j] = ' ';
}
chageCell(posII, posI, c, 1, 0);
break;
}
else
{
printf("Wrong Cell\n try Again: \n");
}
}
}
这是奥赛罗比赛的一部分,
问题是当我输入错误的单元格位置时,消息Wrong cell
在控制台中出现三次,但逻辑上不可能,在每次显示Wrong cell
消息后,它应该等待第二次输入。< / p>
答案 0 :(得分:1)
当我输入错误的单元格位置时,消息&#34;错误的单元格&#34;在控制台中出现三次
取决于输入,&#34;错误的单元格&#34;将出现循环一次无效输入一个字符的次数。
考虑:
scanf("%c%d", &posC, &posI);
当输入有效时,scanf
将读取一个字符和一个数字。当输入无效时,scanf
将只读取一个字符,而后续调用scanf
将使输入缓冲区中的所有其他内容消失。
您可以通过检查scanf
的返回值来判断int
是否没有阅读if (scanf("%c%d", &posC, &posI) != 2) {
// The input is incomplete. Ignore the input to end-of-line
...
continue;
}
// If the code reaches this line, you know that both `posC` and `posI` have been read correctly.
:
scipy.linalg.svd()
答案 1 :(得分:0)
您的scanf
没有失败。
你的逻辑错误。董事会始终是&#39; *&#39;在要求的位置。
为了更好地解释,我对你的游戏做了以下假设: *您初始化了一个8 x 8的电路板,每个电池都用于&#39; *&#39;在某些时候。
如果进行以下更改:
else
{
printf("posC=%c, posI=%d\n", posC, posI);
printf("Wrong Cell\n try Again: \n");
}
然后您将看到您从scanf
获得了值。
我创建了以下内容并将其添加到代码中:
void printBoard() {
int i,j;
printf("\n");
for (i=0; i<9; i++) {
for (j=0; j<9; j++) {
printf(" %c", board[i][j]);
}
printf("\n");
}
printf("\n");
}
然后按如下方式添加:
else
{
printf("posC=%c, posI=%d\n", posC, posI);
printBoard();
printf("Wrong Cell\n try Again: \n");
}
你会看到董事会永远不会改变。