Scanf和While循环不等待用户输入

Scanf和While循环不等待用户输入,c,while-loop,scanf,C,While Loop,Scanf,我希望这段代码要求用户输入一年,然后告诉他们这是否是闰年。然后问他们是否愿意再检查一年。现在,它提出了第一个问题,并给出了答案 然后程序打印出下一个问题,但不等待输入并退出while循环。我一直在其他帖子上寻找解决方案,我想我可能已经有了,但它一直在做同样的事情。有人能帮我写一个程序来打发时间吗?这个程序现在已经让人头疼了?我写了很多更复杂的程序,这一个让我很沮丧。我希望我已经说清楚了。非常感谢 //Check if the year is a leap year #include <st

我希望这段代码要求用户输入一年,然后告诉他们这是否是闰年。然后问他们是否愿意再检查一年。现在,它提出了第一个问题,并给出了答案

然后程序打印出下一个问题,但不等待输入并退出while循环。我一直在其他帖子上寻找解决方案,我想我可能已经有了,但它一直在做同样的事情。有人能帮我写一个程序来打发时间吗?这个程序现在已经让人头疼了?我写了很多更复杂的程序,这一个让我很沮丧。我希望我已经说清楚了。非常感谢

//Check if the year is a leap year
#include <stdio.h>

#define YES 1
#define NO 0

void leapyear()
{
    int year;
    printf("Enter a year: \n");
    scanf("%i", &year);
    int x = year % 4;
    int answer;
    if (x == 0)
    {
        answer = YES;
    }
    else
    {
        answer = NO;
    }
    if (answer == YES)
    {
        printf("The year %i is a leap year.\n", year);          
    }
    else
        printf("The year %i is not a leap year.\n", year);
}

int main (void)
{
    char again;
    printf("Would you like to check if a year is a leap year? y or n\n");
    scanf("%c", &again);
    while(again == 'y')
    {
        leapyear();
        printf("Would you like to check if a year is a leap year? y or   n\n");
        scanf("%c", &again);
    }
    return 0;
}
//检查年份是否为闰年
#包括
#定义是1
#定义0
无效年份()
{
国际年;
printf(“输入年份:\n”);
scanf(“%i”和“年”);
int x=第%4年;
int答案;
如果(x==0)
{
答案=是;
}
其他的
{
答案=否;
}
如果(回答==是)
{
printf(“年%i是闰年。\n”,年);
}
其他的
printf(“年份%i不是闰年。\n”,年份);
}
内部主(空)
{
再次烧焦;
printf(“您想检查一年是闰年吗?y还是n\n”);
scanf(“%c”,再次(&D);
while(再次=='y')
{
闰年();
printf(“您想检查一年是闰年吗?y还是n\n”);
scanf(“%c”,再次(&D);
}
返回0;
}

问题在于,在用户输入年份并按下enter键后,新行字符留在输入缓冲区中,因此在下一次传递时,它将读取“\n”并退出循环。再次使用
scanf(“%c”)在while循环中

int main (void)
{
    char again;
    printf("Would you like to check if a year is a leap year? y or n\n");
    scanf("%c", &again);
    while (again == 'y')
    {
        leapyear();
        printf("Would you like to check if a year is a leap year? y or   n\n");
        scanf(" %c", &again);
    }
    return 0;
}

问题是,在用户输入年份并按enter键后,新行字符留在输入缓冲区中,因此在下一次传递时,它将读取“\n”并退出循环。再次使用
scanf(“%c”)在while循环中

int main (void)
{
    char again;
    printf("Would you like to check if a year is a leap year? y or n\n");
    scanf("%c", &again);
    while (again == 'y')
    {
        leapyear();
        printf("Would you like to check if a year is a leap year? y or   n\n");
        scanf(" %c", &again);
    }
    return 0;
}
当您执行以\n结尾的printf()时,下一个scanf()将接受它

试试这个

scanf(" %c", &again)
       ^ a space here

scanf("\n%c", &again)

Or remove \n from printf because you might not want cursor to go to next line
或者使用getchar()

可以在scanf()之前刷新或删除缓冲区中的1个字符

Source

当您执行以\n结尾的printf()时,下一个scanf()将接受它

试试这个

scanf(" %c", &again)
       ^ a space here

scanf("\n%c", &again)

Or remove \n from printf because you might not want cursor to go to next line
或者使用getchar()

可以在scanf()之前刷新或删除缓冲区中的1个字符


Source

看起来代码是正确的,您能从如下printf语句中删除换行符“\n”并重试吗

printf(“您想检查一年是闰年吗?y还是n”)


因为我在JAVA Scanner类中遇到了类似的问题。

看起来代码是正确的,您能像下面这样从printf语句中删除换行符“\n”并重试吗

printf(“您想检查一年是闰年吗?y还是n”)



因为我在JAVA Scanner类中遇到了类似的问题。

顺便说一句,您检查闰年的方法是错误的。谢谢sjsam。我意识到了这一点,我只是冲过这个低洼的地方,看哪,我被它吞噬了!顺便说一下,你检查闰年的方法是错误的。谢谢你。我意识到了这一点,我只是冲过这个低洼的地方,看哪,我被它吞噬了!谢谢你。太好了!就我的理解而言,是循环中的问题导致了问题吗?你认为将来在scanf(如上)中放置一个空格更好吗?欢呼当用户输入年份(如1234)并按enter“\n”时,输入缓冲区中存储的值为1234\n,因此下次调用scanf时,它将获取“\n”并退出循环。使用空间是更好还是不更好。。。取决于您正在执行的操作,例如scanf(“\n%c”,&再次);或者刷新输入缓冲区也可以,只要记住在使用scanf并尝试获取字符时的新行字符。明白了。感谢您的解释。请记住,当您使用scanf查找字符时,无论何时您请求年份scanf(“%i”,&year);它像一个冠军一样工作。仅出色的字符,注意!:-)谢谢你。太好了!就我的理解而言,是循环中的问题导致了问题吗?你认为将来在scanf(如上)中放置一个空格更好吗?欢呼当用户输入年份(如1234)并按enter“\n”时,输入缓冲区中存储的值为1234\n,因此下次调用scanf时,它将获取“\n”并退出循环。使用空间是更好还是不更好。。。取决于您正在执行的操作,例如scanf(“\n%c”,&再次);或者刷新输入缓冲区也可以,只要记住在使用scanf并尝试获取字符时的新行字符。明白了。感谢您的解释。请记住,当您使用scanf查找字符时,无论何时您请求年份scanf(“%i”,&year);它像一个冠军一样工作。仅出色的字符,注意!:-)谢谢你的信息/反馈。谢谢你的信息/反馈。整理好了,这就是问题所在。不过谢谢。:)把它整理好,这就是问题所在。不过谢谢。:)