2

我找到主要因素的程序已经全部设置好......我唯一需要做的就是这种类型的输出:

你想试试其他号码吗?说 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() */
4

4 回答 4

4

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

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", &number);

于 2013-01-31T04:24:05.603 回答
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();
于 2013-01-31T04:37:07.963 回答
0

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

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

fpurge(stdin);
于 2013-01-31T04:51:03.660 回答
0

只是放在你的声明getchar()之后,它会从缓冲区中吃掉不必要的东西......scanf'\n'

于 2013-01-31T04:27:14.090 回答