为什么在y
答案中输入字母char
后,此循环为什么不继续?
我认为getchar()
会有所帮助,但似乎并没有做任何事情。
#include <stdio.h>
int main(void)
{
char answer = 'y';
int num = 0;
printf("Enter a number: \n");
scanf("%d", &num);
while(answer != 'n')
{
int mult = 1;
int k = 1;
while (k <= num)
{
mult *= k;
k++;
}
printf("%d! = %d\n", num, mult);
printf("Would you like to try another number? \n");
printf("Enter: y for yes | n for no\n");
getchar();
scanf("%c", &answer);
}
}
答案 0 :(得分:2)
我在您的程序中未进行任何更正。
factorial
定义一个单独的可重用函数,我使您的程序更具可读性和模块化。 'y'
,则再次询问用户该号码更有意义。因此,我已经移动了所需的代码。scanf
和getchar
。因此,我们可以仅将scanf
用于该程序。 scanf()
函数会在尝试分析字符以外的转换之前自动删除空格。字符格式(主要是%c;还有扫描集%[…] —和%n)是例外;他们不会删除空格。在leading blank
中使用“%c”可以跳过可选的空格。不要在scanf()格式字符串中使用尾随空白。
请注意,这仍然不会占用输入流中甚至行尾的空白,因此请注意在同一输入流上同时使用getchar()或fgets()。我们只是让scanf在转换前跳过空白,就像%d和其他非字符转换一样。
#include <stdio.h>
unsigned long factorial(unsigned long num)
{
unsigned long mult = 1;
unsigned long k = 1;
while (k <= num) {
mult *= k;
k++;
}
return mult;
}
int main(void)
{
char answer = 'y';
do {
int num = 0;
printf("Enter a number: \n");
scanf(" %d", &num);
unsigned long mult = factorial(num);
printf("%d! = %lu\n", num, mult);
printf("Would you like to try another number? \n");
printf("Enter: y for yes | n for no\n");
scanf(" %c", &answer);
} while (answer != 'n');
return 0;
}
答案 1 :(得分:0)
getchar(); // takes the user input but assigns it nowhere
scanf("%c", &answer); // reads newline, aborts while loop
使用c = getchar();
并省略scanf
。
还要注意,更惯用的方法是使用do-while
循环。
答案 2 :(得分:0)
您的代码正常工作,循环继续进行:由于该部分不在循环中,因此不会重新询问该数字。将其移入内部。还要注意,即使按下任何其他键而不是n
,您的代码仍会继续执行。
这是一种从代码开始的方法:
#include <stdio.h>
int main(void)
{
char answer = 'y';
int num = 0;
while(answer != 'n')
{
printf("Enter a number: \n");
scanf("%d", &num);
int mult = 1;
int k = 1;
while (k <= num)
{
mult *= k;
k++;
}
printf("%d! = %d\n", num, mult);
printf("Would you like to try another number? \n");
printf("Enter: any key for yes | n for no\n");
getchar();
scanf("%c", &answer);
}
}