简单单位转换程序 - do-while 循环的 scanf 问题(C 编程)

Simple Unit Conversion Program - scanf issues with do-while loop (C programming)

我目前遇到的问题是程序没有执行到第一个 scanf 命令之前的部分,只是跳过了整个决策过程和 returns 到 do-while 循环的开头.我已经阅读了其他告诉人们使用 fgetc() 的建议,因为输入转换类型 (1-5) 后的回车按钮会在输入缓冲区中创建一个空的 space ,这会阻止这种情况发生,但我真的宁愿不是因为它不是我当前学习的一部分 material,作为最后的手段我将使用它,甚至我不确定如何代替 scanf 实现。该程序看起来好像完成了,将其转换为 c++ 代码(我熟悉的代码)使其可以工作,但由于某种原因,它在 C 代码中没有与我合作。我还尝试了 Whosebug 的另一个建议,其中提到使用 scanf:scanf("%c*c", &conversionDirection);这实际上确实允许它进入下一节,但有时会迫使你两次输入你的决定,第一次输入没有给你反应......如果有人可以从这里开始测试这个代码原因,我将非常感激我不知道该怎么做了,我已经尝试了一切。

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

int main()
{
    int userChoice;
    char conversionDirection;
    float calculateNumber;

    do
    {
        printf("Please enter one of the following: \n");
        printf("Number\tConversion\n\n");
        printf("1\t Kilogram/Pound\n");
        printf("2\t Litre/Gallon\n");
        printf("3\t Centimeter/Inch\n");
        printf("4\t Celsius/Fahrenheit\n");
        printf("5\t Quit\n");
        scanf("%d", &userChoice);

        if (userChoice == 1)
        {
            printf("Enter 'K' for Kilogram -> Pound or Enter 'P' for Pound -> Kilogram\n");
            scanf("%c", &conversionDirection);

            if (conversionDirection == 'K')
            {
                printf("Please enter the amount of Kilograms\n");
                scanf("%f", &calculateNumber);

                printf("%f Kilograms is equal to %f Pounds\n\n", calculateNumber, calculateNumber * 2.2);
            }
            else if (conversionDirection == 'P')
            {
                printf("Please enter the amount of Pounds\n");
                scanf("%f", &calculateNumber);

                printf("%f Pounds is equal to %f Kilograms\n\n", calculateNumber, calculateNumber / 2.2);
            }
        }
        else if (userChoice == 2)
        {
            printf("Enter 'L' for Litre -> Gallon or Enter 'G' for Gallon -> Litre\n");
            scanf("%c", &conversionDirection);

            if (conversionDirection == 'L')
            {
                printf("Please enter the amount of Litres\n");
                scanf("%f", &calculateNumber);

                printf("%f Liters is equal to %f Gallons\n\n", calculateNumber, calculateNumber * 0.264172);
            }
            else if (conversionDirection == 'G')
            {
                printf("Please enter the amount of Gallons\n");
                scanf("%f", &calculateNumber);

                printf("%f Gallons is equal to %f Liters\n\n", calculateNumber, calculateNumber / 0.264172);
            }
        }
        else if (userChoice == 3)
        {
            printf("Enter 'C' for Centimeter -> Inch or Enter 'I' for Inch -> Centimeter");
            scanf("%c", &conversionDirection);

            if (conversionDirection == 'C')
            {
                printf("Please enter the amount of Centimeters\n");
                scanf("%f", &calculateNumber);

                printf("%f Centimeters is equal to %f Inches\n\n", calculateNumber, calculateNumber * 0.393701);
            }
            else if (conversionDirection == 'I')
            {
                printf("Please enter the amount of Inches\n");
                scanf("%f", &calculateNumber);

                printf("%f Inches is equal to %f Centimeters\n\n", calculateNumber, calculateNumber / 0.393701);
            }
        }
        else if (userChoice == 4)
        {
            printf("Enter 'C' for Celsius -> Fahrenheit or Enter 'F' for Fahrenheit -> Celsius");
            scanf("%c", &conversionDirection);

            if (conversionDirection == 'C')
            {
                printf("How many degrees Celsius?\n");
                scanf("%f", &calculateNumber);

                printf("%f degrees Celsius is equal to %f degrees Fahrenheit\n\n", calculateNumber, (calculateNumber * 9 / 5) + 32);
            }
            else if (conversionDirection == 'F')
            {
                printf("How many degrees Fahrenheit?\n");
                scanf("%f", &calculateNumber);

                printf("%f degrees Fahrenheit is equal to %f degrees Celsius\n\n", calculateNumber, (calculateNumber - 32) * 5 / 9);
            }
        }
        else if (userChoice == 5)
        {
            printf("Program Exit");
            return 0;
        }
        else
        {
            printf("Please enter a valid number");
        }
    } while (userChoice != 5);


    return 0;
}

使用 scanf 时的两个建议(尤其是数字):

1) 在每次调用 scanf 之前使用 fflush(stdin);

2) 检查 unputs 的结果 - 是否收到号码?

例如,如果输入不正确就无法工作:

do{
     printf("Please, enter number: ");
     fflush(stdin);
} while( 1 == scanf("%d", &number));