循环两次输出我的C程序的菜单

Loop outputs the menu of my C program twice

所以在 Code Review 上,我制作了一个计算器,可以执行加法等正常操作 (Here was the question)。无论如何,我听从了一些建议并更新了程序。然而,原始程序的菜单工作正常,它在用户运行程序时输出一次菜单,当他们完成计算时,程序将循环回到开始并再次退出菜单。就像任何其他无限循环一样。但我决定再次从头开始制作程序,但这次程序在用户进行第一次计算后输出菜单两次。我试过做 for(;;) 而不是 do-while 循环,但我遇到了同样的问题。我不知道出了什么问题,如果有人能为我解决这个问题,我将不胜感激,这样我就不会再遇到这个问题了。

代码如下:

#include <stdio.h>
#include <stdlib.h>

void getNumbers(float *, float *);
float addition(float, float);
float subtraction(float, float);
float multiplication(float, float);
float division(float, float);

int main(void)
{
    do
    {
        float num1, num2;
        char choice;

        puts("\nEnter number or letter from below\n\n"
             "\t1. Addition\n"
             "\t2. Subtraction\n"
             "\t3. Multiplication\n"
             "\t4. Division\n"
             "\tQ. Quit program");

        printf("\nEnter choice: ");
        scanf("%c", &choice);

        if(choice == 'q' || choice == 'Q')
        {
            puts("\nQuitting program...");
            exit(0);
        }
        else if(choice < '1' || choice > '4')
        {
            puts("\nInvalid input");
        }
        else
        {
            getNumbers(&num1, &num2);

            if(choice == '1')
            {
                printf("\n%.2f + %.2f = %.2f\n", num1, num2, addition(num1, num2));
            }
            else if(choice == '2')
            {
                printf("\n%.2f - %.2f = %.2f\n", num1, num2, subtraction(num1, num2));
            }
            else if(choice == '3')
            {
                printf("\n%.2f * %.2f = %.2f\n", num1, num2, multiplication(num1, num2));
            }
            else if(choice == '4')
            {
                if(num2 == 0)
                {
                    puts("\nDivision by zero");
                }
                else if(num2 != 0)
                {
                    printf("\n%.2f / %.2f = %.2f\n", num1, num2, division(num1, num2));
                }
            }
            else
            {
                puts("\nInvalid input");
            }
        }
    }while(1);
    return 0;
}

void getNumbers(float *num1_ptr, float *num2_ptr)
{
    printf("\nEnter first number: ");
    scanf("%f", num1_ptr);

    printf("\nEnter second number: ");
    scanf("%f", num2_ptr);
}
float addition(float num1, float num2)
{
    return num1 + num2;
}
float subtraction(float num1, float num2)
{
    return num1 - num2;
}
float multiplication(float num1, float num2)
{
    return num1 * num2;
}
float division(float num1, float num2)
{
    return num1 / num2;
}

可能是你的scanf有问题? 试试这个:

scanf(" %c", &choice);

您的方式 scanf 可能会留下换行符,这将在下一次迭代中使用。

程序两次输出菜单的原因

(包括 "invalid input" 消息)

是因为值是通过 return 键输入的

(选择不多)

代码在循环回到循环顶部之前没有清空标准输入。

建议在循环结束之前添加:

while( getchar() != '\n' );