【问题标题】:do while loop for Yes/No user prompt为是/否用户提示执行while循环
【发布时间】:2013-01-31 04:20:27
【问题描述】:

我的寻找素因数的程序已经设置好了……我唯一需要做的就是这种类型的输出:

你想试试其他号码吗?说 Y(es) 或 N(o): y //要求另一个号码(再次通过程序)

你想试试其他号码吗?说 Y(es) 或 N(o):n //感谢您使用我的程序。再见!

我在下面尝试过...当我输入 n 时,它会输出正确的结果。但是,如果我输入“y”,它只会说 n 所做的同样的事情......我如何循环整个程序而不将程序代码放在我拥有的这个 while 循环中?所以当我按 y 时它会再次通过程序?

int main() {
  unsigned num;
  char response;

  do{
    printf("Please enter a positive integer greater than 1 and less than 2000: ");
    scanf("%d", &num);
    if (num > 1 && num < 2000){
      printf("The distinctive prime facters are given below: \n");
      printDistinctPrimeFactors(num);
      printf("All of the prime factors are given below: \n");
      printPrimeFactors(num);
    }
    else{
      printf("Sorry that number does not fall within the given range. \n");
    }
    printf("Do you want to try another number? Say Y(es) or N(o): \n");
    response = getchar();
    getchar();
  }
  while(response == 'Y' || response == 'y');
  printf("Thank you for using my program. Goodbye!");

  return 0;
} /* main() */

【问题讨论】:

    标签: c loops do-while


    【解决方案1】:

    问题可能是,您从getchar 得到的不是y 并且循环退出,因为条件不匹配。

    getchar() 可能使用缓冲区,因此当您输入“y”并按回车时,您将得到 char 121(y)和 10(回车)。

    试试下面的程序,看看你得到了什么输出:

    #include <stdio.h>
    
    int main(void) {
        char c = 0;
    
        while((c=getchar())) {
            printf("%d\n", c);
        }
        return 0;
    }
    

    你会看到这样的:

    $ ./getchar 
    f<hit enter>
    102
    10
    

    您可以看到键盘输入被缓冲,并且在下一次运行getchar() 时,您将获得缓冲的换行符。

    编辑:就您的问题而言,我的描述只是部分正确。您使用scanf 读取您正在测试的数字。所以你这样做:数字,输入,y,输入。

    scanf 读取数字,将输入中的换行符留在缓冲区中,response = getchar(); 读取换行符并将换行符存储在 response 中,下一次调用 getchar()(去除我描述的换行符以上)获取'y' 并且您的循环退出。

    您可以通过让scanf 读取换行符来解决此问题,这样它就不会停留在缓冲区中:scanf("%d\n", &amp;number);

    【讨论】:

    • 是的,getchar() 返回一个整数。在while 语句中,将值与Yy 的整数ASCII 值进行比较。
    • 抱歉,我无法详细说明您要我做什么。能具体一点吗?
    【解决方案2】:

    使用scanf读取输入时(当您在上面输入数字时),按下回车键后会读取输入,但回车键生成的换行符不会被scanf消耗。

    这意味着您对 getchar() 的第一次调用将返回换行符(仍然位于缓冲区中),它不是“Y”。

    如果您反转对 getchar() 的两次调用 - 其中第二次是您分配给变量的调用,您的程序将运行。

    printf("Do you want to try another number? Say Y(es) or N(o): \n");
    getchar(); // the newline not consumed by the scanf way above 
    response = getchar();
    

    【讨论】:

      【解决方案3】:

      只需将getchar() 放在你的scanf 语句之后,它会从缓冲区中吃掉不必要的'\n'...

      【讨论】:

      • 不,递归不是解决这个问题的办法。
      • 大约三个小时前,我终于在这里获得了投反对票的声誉。我想我可能永远不会使用它。谢谢你让我做一次。
      • “如何在不将程序代码放入我拥有的这个 while 循环中的情况下循环整个程序?所以当我按 y 时它会再次通过程序?”我只是对他的这两个陈述给出了答案... mrunion 您可以尝试我给出的示例代码,如果这不起作用您可以按下按钮...
      • 您的解决方案不起作用(我测试过)。这个问题与他的代码的流程和分支无关。这完全是关于 response=getchar() 如何从上面的 scanf 返回输入缓冲区中的剩余换行符。
      • 啊啊好吧..!!我错误地提出了问题..!我从 if 部分中删除了他的所有代码...抱歉误会!
      【解决方案4】:

      正如其他人所说,输入流中有一个“\n”字符是您之前调用 scanf() 时遗留下来的。

      幸运的是,标准库函数 fpurge(FILE *stream) 会擦除给定流中缓冲的任何输入或输出。当放置在您对 scanf() 和 getchar() 的调用之间的任何位置时,以下内容将清除 stdin 中剩余的任何内容:

      fpurge(stdin);
      

      【讨论】:

        猜你喜欢
        • 2021-09-03
        • 1970-01-01
        • 1970-01-01
        • 2014-01-21
        • 2013-05-09
        • 2019-08-03
        • 1970-01-01
        • 2015-07-18
        • 1970-01-01
        相关资源
        最近更新 更多