【问题标题】:scanf is being skipped: how to make it take user's input?scanf 被跳过:如何让它接受用户的输入?
【发布时间】:2014-10-28 22:14:07
【问题描述】:

我最近不得不创建一个重现蒙蒂霍尔问题的程序。我必须让用户在 1 到 3 之间选择一扇门。然后我随机选择哪个门后面有奖品。完成后,我向用户显示一扇没有奖品的门,此时他可以选择保留原来的门或更改它。这就是我的问题发生的地方。下面的代码块(我的所有变量之前都已初始化)是当我要求用户保留原始门或更改它时。由于一些未知的原因,程序不会等待用户输入他的选择;相反,它会跳过 scanf("%c", &choice)。我不知道这是怎么发生的,有人能解释这个谜吗?谢谢你:)

int portes[] = {0,0,0};
        srand(time(0));
        winning_door= rand()%3;
        doors[winning_door] = 1;
        printf("\nChoose a door:\n");
        scanf("%d", &chosen_door);

        for(i = 0; i<3; i++)
        {
            if(doors[i] == 0 && i != (chosen_door-1))
            {
                printf("The door number %d is empty!\n", i+1);
                printf("\nWould you like to change doors? Enter 'y' for yes and 'n' for no.\n");
                scanf("%c", &choice);
                break;
            }
        }

在这段代码中,scanf("%c", &choice);被完全忽略,程序跳到下一部分!

【问题讨论】:

    标签: char scanf


    【解决方案1】:

    问题在于 scanf 的 %c 指令读取单个字符 WITHOUT 跳过空格。因此,在您的情况下,它将读取在第一个 Choose a door 问题/答案之后仍然挂在输入上的换行符。您可以改为使用%1s 读取单个非空白字符(并忽略所有空白),这将跳过剩余的换行符和用户可能输入的任何空白,返回他们输入的第一个“真实”字符。但是,如果这样做,则需要将选择声明为两个字符的数组 (char choice[2]),因为 scanf 将在读取单个字符后写入一个 NULL 字节。

    或者,您可以在%c 之前在格式中添加一个空格(因此它会是scanf(" %c", &amp;choice)),这会显式跳过所有空白字符。

    【讨论】:

    • 谢谢,我可以正常运行程序了!
    猜你喜欢
    • 2011-01-09
    • 2021-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-29
    • 2016-04-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多