可能重复:
如果在C 中跳过了循环中的语句
有一个奇怪的问题。我做了一个程序,你可以点饮料、薯条或鱼。当你订购任何东西时,第二行是"你想要什么尺寸:(s小,m中,l大)"。现在,您只能输入s, S, m, M, l, or L.
。除此之外,它将进入循环,并告诉您只输入上面6个字符中的一个。
在我的验证函数中,我有3种情况,其中一种是如果您将以下内容作为验证中的第一个参数:foodSize, foodSelect, or order.
一旦进入验证功能,如果选择为foodSize
,则进入以下循环:
if (choice == "foodSize")
{
do {
answer = getchar();
if (answer == 'S' || answer == 's')
{ rc = 0; }
else if (answer == 'M' || answer == 'm')
{ rc = 1; }
else if (answer == 'L' || answer == 'l')
{ rc = 2; }
if (rc == -1 && answer != -1)
{
printf("Please enter S or M only: ");
while (answer != -1 && answer != 'n')
answer = getchar();
}
} while (rc == -1 && answer != -1);
}
我在foodSize中的代码与在其他两个if中的代码完全相同,只是将do while中的第三个if语句中的printf切换到Please enter X or X only:
,这不会影响任何内容。所有其他循环都可以工作,不管我是将它们按不同的顺序排列,还是将其放入if, else if, and else
或if, else if, or else if
中。
具有相同代码且运行良好的循环(意味着它会先询问我的输入,不会先给我错误消息):
if (foodChoice == "Drinks")
{
do {
answer = getchar();
if (answer == 'S' || answer == 's')
{ rc = 1; }
else if (answer == 'C' || answer == 'c')
{ rc = 2; }
else if (answer == 'T' || answer == 'T')
{ rc = 3; }
if (rc == -1 && answer != -1)
{
printf("Please enter S, C, or T only: ");
while (answer != -1 && answer != 'n')
answer = getchar();
}
} while (rc == -1 && answer != -1);
}
什么都不管用,什么都不适合。甚至当我在问题函数中将verify("foodSize", foodChoice)
放在第一位时也不会
我提问功能的一部分:
printf("nDo you order %s? (Y/N): ", foodChoice);
verify("order", foodChoice);
printf("%s choice %s: ", foodChoice, foodOptions);
verify("foodSelect", foodChoice);
printf("What size (L - Large, M - Medium, S - Small): ");
verify("foodSize", foodChoice);
如果我把verify("foodSize", foodChoice)
放在第一次打印之后,它也不会改变任何东西。
无论怎样,输出总是跳过我的get char,首先给我错误消息,然后在验证函数REGARDLESS中的foodSize循环中提示我输入循环的位置或顺序。
输出:
What size (L - Large, M - Medium, S - Small): Please enter S or M only:
应该是什么时候:
What size (L - Large, M - Medium, S - Small):
只有当我没有输入小写或大写L、M或S时,才会提示我。然而,不管怎样,它都会提示我。我手足无措,还没能解决这个问题。我知道我的代码看起来很糟糕,我知道我在其中做事情的一些方式不是目前的标准方式,但这是我们在学校里必须做的方式,所以请不要指出这些错误。我只想知道为什么这个循环不起作用,我想修复它,仅此而已。
FULL SOURCE以防有人想编译它并自行运行。
http://pastebin.com/raw.php?i=hjPDu4QB
无论谁发现为什么这不起作用,都会得到永恒的巨大满足。
如果行
if (choice == "foodSize")
如果正在运行,那么您将依赖编译器优化。这是在比较这两个字符串在内存中的位置;如果这是真的,那只是因为编译器将它们优化为指向同一字符串的两个指针。比较字符串的正确方法是使用strcmp
:
if(strcmp(choice, "foodSize") == 0)
这实际上会比较字符串的内容。