C++ 在控制台中获取是/否总是失败

C++ 在控制台中获取是/否总是失败,c++,input,console,C++,Input,Console,我正在尝试制作一个程序,只要用户每次都说“是”,这个程序就会一遍又一遍地运行。不幸的是,当我在其中输入yes或no时,它似乎无法识别,并且总是执行默认的“Come reach?”消息。这是我用来从控制台获取输入的代码: bool getYN(){ bool confirmed = 0; bool answer = 0; string input; while(!confirmed){ getline(cin, input, '\n');

我正在尝试制作一个程序,只要用户每次都说“是”,这个程序就会一遍又一遍地运行。不幸的是,当我在其中输入yes或no时,它似乎无法识别,并且总是执行默认的“Come reach?”消息。这是我用来从控制台获取输入的代码:

bool getYN(){
    bool confirmed = 0;
    bool answer = 0;
    string input;
    while(!confirmed){
        getline(cin, input, '\n');
        transform(input.begin(), input.end(), input.begin(), toupper);

        if(input.c_str() == "Y" || input.c_str() == "YES"){ //If the user says yes
            confirmed = 1;
            answer = 1;
        } else if(input.c_str() == "N" || input.c_str() == "NO"){ //If the user says no
            confirmed = 1;
            answer = 0;
        } else { //If the user says something else entirely
            printf("\nCome again? (Y/N) ");
        };
    };
    return answer;
};
我已经包括了
。出于某种原因,当我输入它们时,它总是表现为没有得到y/yes或n/no。它总是让我再回答一次

if(input.c_str() == "Y" || input.c_str() == "YES"){ //If the user says yes
    confirmed = 1;
    answer = 1;
} else if(input.c_str() == "N" || input.c_str() == "NO"){ //If the user says no
    confirmed = 1;
    answer = 0;
}
您不应该像这样进行c字符串比较。您将获取一个字符的地址,并与一个文本分配对象的地址进行比较。当然,比较结果会返回false

使用C++字符串,简单<代码>运算符==/COD>比较有效:

if(input == "Y" || input == "YES"){ //If the user says yes
    confirmed = 1;
    answer = 1;
} else if(input == "N" || input == "NO"){ //If the user says no
    confirmed = 1;
    answer = 0;
}
您不应该像这样进行c字符串比较。您将获取一个字符的地址,并与一个文本分配对象的地址进行比较。当然,比较结果会返回false

使用C++字符串,简单<代码>运算符==/COD>比较有效:

if(input == "Y" || input == "YES"){ //If the user says yes
    confirmed = 1;
    answer = 1;
} else if(input == "N" || input == "NO"){ //If the user says no
    confirmed = 1;
    answer = 0;
}

我已经根据当前的最佳答案修改了代码,但我也对其进行了优化,以便不再需要
确认

bool getYN(){
    bool answer = 0;
    string input;
    while(!answer){
        getline(cin, input, '\n');
        transform(input.begin(), input.end(), input.begin(), toupper);

        if(input == "Y" || input == "YES"){
            answer = 2;
        } else if(input == "N" || input == "NO"){
            answer = 1;
        } else {
            printf("\nCome again? (Y/N) ");
        };
    };
    return answer - 1;
};

小优化,当然,但每一点都很重要。

我已经根据当前的最佳答案修改了代码,但我也对其进行了优化,以便不再需要
确认

bool getYN(){
    bool answer = 0;
    string input;
    while(!answer){
        getline(cin, input, '\n');
        transform(input.begin(), input.end(), input.begin(), toupper);

        if(input == "Y" || input == "YES"){
            answer = 2;
        } else if(input == "N" || input == "NO"){
            answer = 1;
        } else {
            printf("\nCome again? (Y/N) ");
        };
    };
    return answer - 1;
};


小优化,当然,但每一点点都很重要。

不相关的学究注:
transform(input.begin(),input.end(),input.begin(),toupper)
是不可移植的,因为
toupper
期望值在0..255范围内,但
char
通常是
有符号的类型,所以你很容易导致未定义的行为。我会记住这一点。谢谢你。@Xirema是为了学习如何编码,除非你明白为什么这是一种不好的做法,并开始使用其他名称空间,否则就不是了。人们往往忘记不是每个人都知道每件事。我在下面添加了我自己的答案和最终的解决方案,但保留了最好的答案,因为这是最有用的。无关的学究笔记:
transform(input.begin(),input.end(),input.begin(),toupper)
是不可移植的,因为
toupper
期望值在0到255之间,但是
char
通常是
有符号的类型,因此很容易导致未定义的行为。我会记住这一点。谢谢你。@Xirema是为了学习如何编码,除非你明白为什么这是一种不好的做法,并开始使用其他名称空间,否则就不是了。人们往往忘记并不是每个人都知道每件事。我在下面添加了我自己的答案和我的最终解决方案,但保留了最好的答案,因为这是最有帮助的。哦,我想你必须从它获取c字符串,当你做的事情涉及其他std::字符串以外的任何东西时。谢谢大家!@KelvinShadewing一般来说,如果需要与c库或类似c的接口兼容,则只应访问对象的c字符串版本。我曾多次使用它来加载着色器,比如OpenGL。但是在那些(通常非常具体的)场景之外,你永远不应该使用原始的c字符串。我会记得的。哦,我以为只要你做的事情涉及到其他std::string以外的任何东西,你就必须从中获取c-string。谢谢大家!@KelvinShadewing一般来说,如果需要与c库或类似c的接口兼容,则只应访问对象的c字符串版本。我曾多次使用它来加载着色器,比如OpenGL。但是在那些(通常非常具体的)场景之外,你永远不应该使用原始的c字符串。我会记住的。但这会一直循环直到得到“是”。我写的方式让我在其他情况下使用它,我只需要得到是或否,比如说,如果我有一个脚本,问玩家他们是否想进入一所房子,作为一个例子。我只需要程序循环,而不需要确认函数本身。我已经更新了代码,向您展示了当用户输入yes和no时,如何结束循环。同时还要确保它是这两个选项中的一个。但这将始终循环,直到得到yes。我写的方式让我在其他情况下使用它,我只需要得到是或否,比如说,如果我有一个脚本,问玩家他们是否想进入一所房子,作为一个例子。我只需要程序来循环,而不是确认函数本身。我已经更新了代码,向您展示了当用户输入yes和no时,如何结束循环。同时还要确保它是这两个选项之一。