对于if语句,虽然它是真的,但它再次循环

时间:2016-11-11 17:48:23

标签: c++ c

#include <stdio.h>

void clearKeyboard(void){

    while(getchar()!='\n');
}

void pause(void){

    printf("Press <ENTER> to continue...");
    clearKeyboard();
}


int getMenuChoice(void){

    int choice;
    printf("1- List all items\n");
    printf("2- Search by SKU\n");
    printf("0- Exit program\n> ");

    scanf("%d", &choice);

    return choice;
}

int getYesOrNo(void){

    char ch;
    int ret;
    ch = 0;
    ret = 0;

    while(ch != 'Y' || ch != 'y' || ch != 'N' || ch != 'n')
    {
            scanf("%c", &ch);
            clearKeyboard();
            if (ch == 'Y' || ch == 'y'){
                    ret = 1;
                    return ret;
            }
            if (ch == 'N' || ch == 'n'){
                    ret = 0;
                    return ret;
            }
            else if (ch != 'Y' || ch != 'y' || ch != 'N' || ch != 'n'){
                    printf("Only (Y)es or (N)o are acceptable: ");
            }
    }
    return ret;
}

int main(void){

    int choice;
    int temp = 0;
    choice = 0;

    printf("=== TEST MENU ===\n");
    pause();
    while(temp == 0){
            choice = getMenuChoice();
            if (choice != 0){
                    printf("*** not implemented ***\n");
            }
            else{
                    printf("Do you really want to quit? ");
                    temp = getYesOrNo();
            }
    }
    printf("=== END OF MENU TEST ===\n");

    return 0;

}

代码运行时,应打印测试菜单 我必须按回车继续

然后,它会显示多个打印语句(listall..search by ... exit)

因此,如果用户输入0,则询问您是否真的要退出,如果用户输入y,则应该退出

然而,问题是程序在询问“你真的想要退出吗?”之后再次询问用户不必要的问题“只有(Y)es或(N)o是否可以接受”。当我已经键入y其中是有效答案。

为什么?

p.s库是否存在

3 个答案:

答案 0 :(得分:2)

Scanf(“%d”,&amp; choice);只消耗数字字符(也会在任何其他输入,iirc上崩溃)但不会消除\ r \ l或\ n字符,这些字符将在getYesOrNo函数中使用,如果我是正确的(有人请指正)。这就是为什么程序在询问你是否真的想要退出之后应该直接显示(y)es /(n)o提醒的原因。

这也是为什么添加clearKeyboard函数使其按预期工作的原因。

答案 1 :(得分:1)

该代码还存在其他一些问题(例如评论中提到的UB)。但是,这个

        if (ch == 'Y' || ch == 'y'){
                ret = 1;
                return ret;
        }
        if (ch == 'N' || ch == 'n'){
                ret = 0;
                return ret;
        }
        else if (ch != 'Y' || ch != 'y' || ch != 'N' || ch != 'n'){
                printf("Only (Y)es or (N)o are acceptable: ");
        }

可能不是你想要的。第一个if独立于之后出现的if - else,因此即使第一个条件为真,也会评估之后的块。很可能你想要这个:

        if (ch == 'Y' || ch == 'y'){
                ret = 1;
                return ret;
        }
        else if (ch == 'N' || ch == 'n'){
                ret = 0;
                return ret;
        }
        else {
                printf("Only (Y)es or (N)o are acceptable: ");
        }

条件ch != 'Y' || ch != 'y' || ch != 'N' || ch != 'n'不是很有意义,因为角色总是不是Y或不是N,因此它总是正确的。

答案 2 :(得分:0)

您应该在%c之前添加空格以自动跳过任何前导空格。在您的情况下,'\n'始终存储在ch中,这就是else if (ch != 'Y' || ch != 'y' || ch != 'N' || ch != 'n')始终为真的原因

scanf(" %c", &ch); //This is the modified statement