我正在尝试将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;
}
答案 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系统上,这个问题可能更糟,以标记行尾。