我找到素数因子的程序全部设定......我唯一需要做的就是这种类型的输出:
你想尝试另一个号码吗?说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() */
答案 0 :(得分:3)
问题可能是,你从y
得到的东西不是getchar
并且循环退出,因为条件不匹配。
getchar()
可以使用缓冲区,因此当您键入“y”并按Enter键时,您将获得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);
。
答案 1 :(得分: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();
答案 2 :(得分:0)
在你的getchar()
陈述之后放scanf
,这将从缓冲区中吃掉不必要的'\n'
...
答案 3 :(得分:0)
正如其他人所说,在你之前调用scanf()时遗留的输入流中只有一个'\ n'字符。
幸运的是,标准库函数fpurge(FILE * stream)擦除了给定流中缓冲的任何输入或输出。当你在调用scanf()和getchar()之间放置任何地方时,以下内容将清除stdin中缓冲区中的任何内容:
fpurge(stdin);