Possible Duplicate:
If statement in my loops are being skipped in 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);
}
没有任何作用,对于 foodSize 没有任何作用。即使我输入 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)
在第一个 printf 之后,它也没有改变任何东西。
输出,无论如何,总是跳过我的 get char,首先给我错误消息,然后提示我在验证函数的 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 时,才会收到提示。但无论如何,它都会提示我。我一筹莫展,还没能解决这个问题。我知道我的代码看起来很糟糕,我知道我在其中做事的一些方法不是当前的标准方法,但这是我们在学校必须做的方法,所以请不要指出这些错误。我只是想知道为什么这个循环不起作用并且我想修复它,仅此而已。
完整源代码以防有人想要编译它并亲自运行它。
http://pastebin.com/raw.php?i=hjPDu4QB
对于发现为什么这行不通的人来说,永恒的圆满。
最佳答案
如果行
if (choice == "foodSize")
完全正常工作,那么您就依赖于编译器优化。其作用是比较这两个字符串在内存中的位置;如果这是真的,这只是因为编译器将它们优化为两个指向同一字符串的指针。比较字符串的正确方法是使用 strcmp
:
if(strcmp(choice, "foodSize") == 0)
这实际上会比较字符串的内容。
关于C 函数跳过 do while 循环中的 if 语句并仅执行最后一个 if 语句,但在第二个相同函数中不执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9898299/