重复 printf()

Repetition of a printf()

我正在尝试创建游戏。为此,我有两个函数 size() 和 ask_column().

Size() 询问用户想要的网格的大小。它 return 应该是 4 或 8 的数字。

int size() /*Ask for the size of the Takuzu that the user wants*/
{
    int size;
    do {
        printf("Type the size of Takuzu that you want (only 4*4 and 8*8 are available): \n");
        scanf("%d",&size);
    }while(size != 4 && size != 8);

    return(size);
}

Ask_column() 询问用户想要的列。您在矩阵中输入网格的大小,它 return 一个字符,如果 4 4 网格则应为 A 到 D,如果 8 8 网格则应为 A 到 H。

char ask_column(int s) /*Ask the user in which column he wants to put his value*/
{
    char column;
    if (s==4)
    {
        do { /*Ask for the column if 4*4*/
            printf("Enter the column of the value you want to enter (A to D): \n");
            scanf("%c", &column);
        } while (column != 'A' && column != 'B' && column != 'C' && column != 'D' && column != 'a' && column != 'b' &&
                 column != 'c' && column != 'd');
    }
    else
    {
        do { /*Ask for the column if 8*8*/
            printf("Enter the column of the value you want to enter (A to H): \n");
            scanf("%c", &column);
        } while (column != 'A' && column != 'B' && column != 'C' && column != 'D' && column != 'E' && column != 'F' &&
                 column != 'G' && column != 'H' && column != 'a' && column != 'b' && column != 'c' && column != 'd' && column != 'e' && column != 'f' &&
                 column != 'g' && column != 'h');
    }
    return column;
}

我遇到的主要问题是重复 Ask_column() 中的问题。如果使用 size(),ask_column() 总是会问这个问题 2 次。如果不是只有一个,那才是我想要的。

int main()
{
    int s;
    s = size();
    ask_column(s);
}

Return :

Type the size of Takuzu that you want (only 44 and 88 are available): 4 Enter the column of the value you want to enter (A to D): Enter the column of the value you want to enter (A to D):

int main()
{
    int s;
    s = 4;
    ask_column(s);
}

Return :

Enter the column of the value you want to enter (A to D):

我真的很想知道这种重复是从哪里来的。

感谢所有愿意提供帮助的人!

您真的不应该使用 scanf 进行用户输入。在这种情况下,解决方案非常简单:您需要使用空格。用户输入第一个数字后,还有一个换行符需要从输入流中读取。 ask_column中的scanf读取,发现不是想要的条目之一,于是又写了提示。为避免该问题,简单的解决方案是在转换说明符中添加一些空格:

scanf(" %c", &column);

但这不是一个好的解决方案。当有人为大小输入 W 时,请考虑您的程序的行为。该程序将立即进入无限循环,不断尝试读取整数,但总是在发现 W 不是 int 中的有效字符时停止。您必须添加一些输入验证并使用无效数据。 scanf 根本不是最好的工具,如果你现在停止使用它,从长远来看 运行 你的生活会容易得多。