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

标签 c

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/

相关文章:

c - 读入 char 并判断是否有空格或换行符 C

c - 如何在我的程序中设置一个依赖于平台的常量

objective-c - 从char*数组到二维数组再返回算法出错

c - C语言中的"register"关键字?

c++ - C/C++ 编程中需要全局析构函数吗?

c - 在 C 中释放内存

java - 缓冲区溢出 (vs) 缓冲区溢出 (vs) 堆栈溢出

c - 为什么在此代码中使用按位运算符的加法比算术加法慢得多

c - 如何通过外部 IP 连接套接字 (Mac)

c++ - 背包算法,如何获得更好的性能?