在Switch语句中嵌套if / else

时间:2012-09-26 07:50:34

标签: c if-statement nested switch-statement

我正在尝试将if / else嵌套在case switch语句中。当我输入案例'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;
}

5 个答案:

答案 0 :(得分:2)

问题是使用带有scanf格式说明符的%c会导致空白空间不被占用,在您的情况下会导致\n留在输入缓冲区中。您的教师似乎建议使用下一个scanf从初始输入中获​​取尾随空格;但是,我怀疑他们说要插入一个前导空格而不是尾随空格,因为这可以解决你的问题:

scanf(" %c", &tireShine);

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

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

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

警告getchar()只会占用输入缓冲区中的一个字符。例如,如果用户要输入长度超过1个字符的字符串,则需要使用while ((x = getchar()) != '\n') ;之类的内容来清除缓冲区。

答案 1 :(得分:0)

尝试内联if。

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;

答案 2 :(得分:0)

你还有一个空间。

更改

scanf("%c ", &tireShine);

scanf("%c", &tireShine);

答案 3 :(得分:0)

试试这个::

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

但要避免使用它。 <强>已更新 ::

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

因为, fflush(stdin)会导致 UNDEFINED BEHAVIOR ,您可以使用 getchar()来清除流。

答案 4 :(得分:0)

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