3

我正在尝试将 if/else 嵌套在 case switch 语句中。当我输入 case 'p' 或 'P' 时,无论输入什么字符,都会打印 $15.00 行。我尝试移动/添加 {},但输出没有变化。

感谢您花时间帮助菜鸟。

整个代码现在在这里。

#include <stdio.h>

int main()
{
//variable declarations 
char typeOfWash, tireShine;

//Menu
printf("R ---> Regular ($5.00)\n");
printf("B ---> Bronze ($7.50)\n");
printf("G ---> Gold ($10.25)\n");
printf("P ---> Platinum ($15.00)\n");
printf("Tire Shine can be added to the Gold or Platinum ONLY,");
printf("for an additional$2.50\n\n");

printf("Enter your selection: ");
scanf("%c",&typeOfWash);

switch (typeOfWash)
{
    case 'R': case 'r':
        printf("Your bill total is: $5.00\n");
        break;
    case 'B': case 'b':
        printf("Your bill total is: $7.50\n");
        break;
    case 'G': case 'g':
        printf("Would you Like a Tire Shine? (Y/N): ");
        scanf("%c ",&tireShine);
        if (tireShine == 'Y' || tireShine == 'y')
            printf("Your bill total is: $12.75\n");
        else
            printf("Your bill total is: $10.25\n");
        break;
    case 'P': case 'p':
        printf("Would you Like a Tire Shine? (Y/N): ");
        scanf("%c ",&tireShine);
        printf("%c",tireShine);
        if (tireShine == 'Y' || tireShine == 'y')
            printf("Your bill total is: $17.50\n");
        else
            printf("Your bill total is: $15.00\n");
        break;
    default:
        printf("Invalid Choice");

}
return 0;
}
4

5 回答 5

2

问题是scanf%c格式说明符一起使用会导致空白不被消耗,在您的情况下会导致\n输入缓冲区中留下空白。您的讲师似乎建议的是,将初始输入的尾随空格与下一个输入一起吃掉scanf;但是,我怀疑他们说要插入前导空格而不是尾随空格,因为这可以解决您的问题:

scanf(" %c", &tireShine);

或者,您可以getchar()在第二个之前立即使用scanf并预先使用换行符:

getchar();
scanf("%c", &tireShine);

第二种选择是使用%s格式说明符而不是%c相应地处理它。

请注意,getchar()只会消耗输入缓冲区中的一个字符。例如,如果用户要输入一个长度超过 1 个字符的字符串,则需要while ((x = getchar()) != '\n') ;清除缓冲区之类的东西。

于 2012-09-26T08:56:18.527 回答
0

如果尝试内联。

case 'P': case 'p':
    printf("Would you Like a Tire Shine? (Y/N): ");
    scanf("%c",&tireShine);
    printf("Your bill total is: $%s\n", toUpper(tireShine) == 'Y' ? "17.50":"15.00");
    break;
于 2012-09-26T07:58:43.593 回答
0

你还有一个空间。

改变

scanf("%c ", &tireShine);

scanf("%c", &tireShine);
于 2012-09-26T07:59:49.883 回答
0

试试这个::

printf("Enter your selection: ");
scanf("%c",&typeOfWash);
fflush(stdin) ;

但避免使用它。 更新::

printf("Enter your selection: ");
scanf("%c",&typeOfWash);
getchar() ;

由于fflush(stdin)将导致UNDEFINED BEHAVIOR,您可以使用getchar()清除流。

于 2012-09-26T08:42:37.387 回答
0

scanf() 的一个问题是它通常会留下未读的“返回”。因此,如果您输入类似“p”然后输入“return”的内容,它会读取并处理“p”而不是“return”。对 scanf() 的第二次调用读取已经存在的“返回”字符,因此它与“y”或“Y”不匹配。您对案例“g”有同样的问题。使用“%c”还是“%c”都没有关系。在有两个字符来标记行尾的 DOS 系统上,这个问题可能更严重。

于 2012-09-26T10:18:47.983 回答