scanf()不等待输入

时间:2017-07-02 11:57:07

标签: c scanf

我有一个功能:

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>

2 个答案:

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

你会看到董事会永远不会改变。