【问题标题】:Do-while loop using C使用 C 的 Do-while 循环
【发布时间】:2015-09-26 02:28:01
【问题描述】:

我在下面使用了一个while循环:

do {

    scanf("%c", &turnChoice);

    if (turnChoice == 'r')
    {
        invalidSelection = false;
    }

    else if (turnChoice == 'h')
    {
        invalidSelection = false;
    }

    else
    {
        printf("Invalid input.\n");
    }

} while (invalidSelection == true);

但是,在停止用户输入之前,它会运行一次完整的循环(因此它会显示“无效输入”,然后要求用户输入一个字母)。我做错了什么?

【问题讨论】:

  • 很可能之前的代码在输入缓冲区中留下了一个字符。
  • 之前没有输入任何字符(我只是声明变量;没有初始化)
  • 这是一个 do...while 循环。总是执行一次。你想要一个while循环,在循环之前评估。 cprogramming.com/tutorial/c/lesson3.html
  • @DomB 所以这是你程序中的第一个输入?在此之前没有按键?在此之前没有运行任何输入的代码?我觉得这很难相信。
  • @DomB 所以这是你的问题。先前的代码在该代码正在读取的输入缓冲区中留下了一个字符。由于它可能不是“h”或“r”(很可能是换行符/回车),因此这段代码告诉您它是无效的。

标签: c while-loop scanf


【解决方案1】:

我的猜测是您在显示的代码之前有一些输入,一些输入以换行符结尾,对吧?

这里的问题是,当您调用scanf 读取一个字符时,换行符仍在输入缓冲区中,因此您读取并获得的是换行符。

有一个非常简单的“技巧”告诉scanf 读取并丢弃前导空格(如换行符),即在格式字符串前添加一个空格,所以试试例如

scanf(" %c", &turnChoice);
//     ^
//     |
// Note space here

【讨论】:

  • 这很好。我错过了......见@DavidSchwartz评论。
【解决方案2】:

take char 输入后,我们需要通过按回车键来获取 '\n' char 是 giver

    char turnChoice;
    bool invalidSelection = true;
    do {

    scanf("%c", &turnChoice);// if you want to give leading space then use scanf(" %c",&turnChoice);
    getchar();
    if (turnChoice == 'r')
    {
        invalidSelection = false;
    }

    else if (turnChoice == 'h')
    {
        invalidSelection = false;
    }

    else
    {
        printf("Invalid input.\n");
    }

} while (invalidSelection == true);

【讨论】:

    【解决方案3】:

    这可能会有所帮助,当您 scanf 在您的第一个字符之后放置“%*c”以忽略您在输入输入后按下的回车键时。代码如下:

    do {
    
    scanf("%c%*c", &turnChoice);
    
    if (turnChoice == 'r')
    {
        invalidSelection = false;
    }
    
    else if (turnChoice == 'h')
    {
        invalidSelection = false;
    }
    
    else
    {
        printf("Invalid input.\n");
    }
    
    } while (invalidSelection == true);
    

    【讨论】:

      猜你喜欢
      • 2018-05-09
      • 2016-09-23
      • 2016-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多