C-循环不会继续

时间:2018-11-21 10:55:42

标签: c loops

为什么在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);
    }       
}

3 个答案:

答案 0 :(得分:2)

我在您的程序中未进行任何更正。

  1. 很难理解您的程序的作用。通过为factorial定义一个单独的可重用函数,我使您的程序更具可读性和模块化。
  2. 如果用户输入了'y',则再次询问用户该号码更有意义。因此,我已经移动了所需的代码。
  3. 我不建议在程序中混合使用scanfgetchar。因此,我们可以仅将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);
            }
    }