C 函数跳过 do while 循环中的 if 语句并仅执行最后一个 if,但不在第二个 SAME 函数中执行



可能重复:
如果在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 elseif, 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)

这实际上会比较字符串的内容。

最新更新