【问题标题】:nested if/else inside Switch Statement嵌套在 Switch 语句中的 if/else
【发布时间】:2012-09-26 07:50:34
【问题描述】:

我正在尝试将 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;
}

【问题讨论】:

  • 能打印出tireShine的值吗?
  • 另外,你可以这样做 if ( toupper(tireShine) == 'Y' )
  • 您的 15$ 或 17.5$ 取决于 Y 或 y,但不取决于 P 或 p。
  • toupper() 返回您调用它时使用的 ASCII 字符的大写。
  • 这是一小段代码,P 或 p 代表铂金,基础价格为 15 美元,额外的轮胎光泽度为 +2.50 美元。就像我说的,我可以进入这个案例,其他一切都很好,如果 &tireShine == 'y' 或 'Y',它只是执行 $17.50 行。

标签: c if-statement nested switch-statement


【解决方案1】:

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

scanf(" %c", &tireShine);

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

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

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

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

【讨论】:

    【解决方案2】:

    你还有一个空间。

    改变

    scanf("%c ", &tireShine);
    

    scanf("%c", &tireShine);
    

    【讨论】:

    • 我需要空间,否则它不允许用户输入。这就是我的结构说现在要做的事情。
    • @user1699174 为什么它不允许使用输入?在 scanf 之后检查tireShine 看看你得到了什么。
    • 刚刚尝试在 scanf() 之后立即打印,它跳过它并打印 $15 行。
    • @user1699174:它不会跳过它,它会打印scanf 读入tireShine\n。如果您删除printf,您应该注意到您的“Would you like...”和“Your bill...”应该在同一行。
    【解决方案3】:

    尝试内联 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;
    

    【讨论】:

    • 试过了,P 输入大小写,然后 Y 的输出是:$15.000000
    • tireShine 是 char * 还是 char?因为在 char * 的情况下,您应该尝试检查“Y”,而在 char 的情况下,您应该检查 'Y'。
    • 只是一个字符,请再看一遍OP。我把我的完整代码放在那里。
    • 如果你把一个 char * 放在那里也会发生同样的情况,我的意思是一个字符串? char*tireShine 和 scanf("%s",tireShine);当然然后检查“Y”或“y”
    • char* 轮胎光泽;在变量声明中?
    【解决方案4】:

    试试这个::

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

    但避免使用它。 更新::

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

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

    【讨论】:

    • 我们赢了!感谢所有一起玩的人。现在这到底是什么?它是如何工作的?
    • 成功了。为什么要避免使用它?我还能做些什么来解决我的问题?
    • 这不是一个成功的答案。 fflush(标准输入);不应该经常使用。尝试用谷歌搜索它。 fflush 刷新流中的数据以强制写入。
    • -1。这是错误的。 fflush(stdin) 导致未定义行为
    • tojrobinson 的回答比我的好。
    【解决方案5】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多