字母输入崩溃程序,只需输入数字

时间:2016-02-02 08:39:10

标签: c user-input infinite-loop

我为我的C编程类编写的源代码存在两个问题。

1)我们必须从1,2,3,4或5的用户那里获得选择。如果做出了除这些选择之外的任何选择,则代码将提醒用户有效的选择。我尝试使用defaultf和printf(),但它没有恢复到它。 2)此外,如果作为选择作出选择,则程序进入无限循环,其中选择提示连续打印给用户。任何帮助是极大的赞赏!下面是我在Microsoft Visual Studio中使用的代码。

#include <stdio.h>

int main(void)
{
    const float OVERTIME_LIMIT = 40.0f;
    const float OVERTIME_RATE = 1.5f;
    const float TAX_LIMIT1 = 300.0f;
    const float TAX_RATE1 = 0.15f;
    const float TAX_LIMIT2 = 150.0f;
    const float TAX_RATE2 = 0.20f;
    const float TAX_RATE3 = 0.25f;

    float gross = 0.0f;
    float tax = 0.0f;
    float work_hours = 0.0f;
    float pay_rate = 0.0f;
    int selection = 0;

    do
    {
    printf("*****************************************************************\n");
    printf("Enter the number corresponding to the desired pay rate or action:\n");
    printf("1)$8.75/hr\t\t\t\t\t2)$9.33/hr\n");
    printf("3)$10.00/hr\t\t\t\t\t4)$11.20/hr\n");
    printf("5)quit\n");
    printf("*****************************************************************\n");
    if ((1 == scanf("%d", &selection)) && selection >= 1 && selection <= 4)
    {
        switch (selection)
        {
        case 1:
            pay_rate = 8.75f;
            break;
        case 2:
            pay_rate = 9.33f;
            break;
        case 3:
            pay_rate = 10.00f;
            break;
        case 4:
            pay_rate = 11.20f;
            break;
        }
        printf("Please enter working hours: ");
        scanf("%f", &work_hours);
        if (work_hours > OVERTIME_LIMIT)
        {
            work_hours = OVERTIME_LIMIT + (work_hours - OVERTIME_LIMIT) * OVERTIME_RATE;
        }
        gross = work_hours * pay_rate;
        if (gross <= TAX_LIMIT1)
        {
            tax = gross * TAX_RATE1;
        }
        else if (gross <= (TAX_LIMIT1 + TAX_LIMIT2))
        {
            tax = TAX_LIMIT1 * TAX_RATE1 + (gross - TAX_LIMIT1) * TAX_RATE2;
        }
        else
        {
            tax = TAX_LIMIT1 * TAX_RATE1 + TAX_LIMIT2 * TAX_RATE2 + (gross - TAX_LIMIT1 - TAX_LIMIT2) * TAX_RATE3;
        }
        printf("Gross: %.2f\n", gross);
        printf("Tax: %.2f\n", tax);
        printf("Net income: %.2f\n\n", gross - tax);
    }
} while (selection != 5);

return 0;

2 个答案:

答案 0 :(得分:1)

您正在使用if语句,如下所示:

if((1 == scanf(“%d”,&amp; selection))&amp;&amp; selection&gt; = 1&amp;&amp; selection&lt; = 4)

在这里,您只允许将1到4的选择值用于切换案例。 然后不需要使用默认情况。如果你使用那么它不会产生任何影响。 因此,删除if条件中的选择值检查。 然后你可以在开关盒本身中添加case 5来退出。 在开关案例中添加默认条件,如果选择不在1到5的范围内,则将打印默认情况下的打印语句。 希望这会有所帮助。

答案 1 :(得分:0)

你的专栏:

   if ((1 == scanf("%d", &selection)) && selection >= 1 && selection <= 4)

导致你的问题。您正在尝试扫描整数行,并且失败,因此扫描取消。下次回到scanf时,流中会出现相同的字母,因为它与您的扫描不匹配且从未使用过。

scanf("%d"不是这里的答案。你需要做的只是获取一个字符,并尝试将其转换为整数。您可以使用以下代码来执行此操作,或者您可以从评论中获取Gabriel的建议,并使用getchar()

char c;
scanf("%c", &c);

获得角色后,需要将其转换为整数。如果它是一个以空字符结尾的字符串,你可以使用atoi,但由于它只是一个字符,你可以做一个“作弊”:

c = c - '0';
if (c >= 1 && c <= 4)

从角色中减去0的字符值会将任何数字转换为实际值。只要您使用if语句检查范围,这将正常工作。