在控制台中获得是/否始终失败

时间:2016-03-21 16:40:02

标签: c++ input console

如果用户每次都说“是”,我会尝试制作一个会反复运行的程序。不幸的是,当我输入yes或no时,它似乎无法识别,并且总是默认"再来一次?"信息。这是我用来从控制台获取输入的代码:

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;
};

我已加入<string><algorithm>。出于某种原因,当我输入时,它总是表现得没有得到y / yes或n / no。它只是让我再次回答。

3 个答案:

答案 0 :(得分:4)

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-string比较。您将获取char的地址并与文本分配的对象的地址进行比较。当然,比较将返回错误。

使用c ++字符串,简单的operator==比较是有效的:

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;
}

答案 1 :(得分:0)

#include <iostream>
#include <string>
using namespace std; // For speed

int main()
{
   bool saidYes = false;
   string input;
   while (!saidYes)
   {
       cout << "Input yes or no: ";
       getline(cin, input); 

       if (input == "no" || input == "n" || input == "NO")
       {
           saidYes = true; // breaks the loop
       }

       if (input == "y" || input == "Y" || input == "yes" || input == "YES")
       {
           saidYes = false;
       }
   }

 return 0;
}

你可以使用上面的例子来消除大部分不必要的代码,我选择不添加else语句,但是如果你在这里添加它也可以。

你也可以进一步压缩这段代码,但这只是一个简单的例子,说明如何更好地为你工作!

如上所述,您可以使用==来比较字符串,如果您来自某些其他语言,这可能是一个烦人的变化,习惯了大声笑。

  

我已经包含了字符串和算法。出于某种原因,当我输入时,它总是表现得没有得到y / yes或n / no。它只是让我再次回答。

你正在尝试做的事情不需要

算法,并且你对字符串输入的阅读和接受要比它需要的要困难得多。

如果你看上面的话,你会看到string input;这将是你可以用来存储用户输入字符串的变量。

您还会注意到getline(cin, input);这是您可以用来阅读&#34;&#34;用户在提示时输入的字符串。

@Kelvin Shadewing我的初步答案仅针对您的问题,下一个例子针对您对我的评论!

所以你有很多选择,但假设你希望用户输入是或否,并根据输入你想要产生一个特定的结果,同时确保一次又一次地提示用户输入是或否你只需要修改我的原始答案。

#include <iostream>
#include <string>
using namespace std; // For speed
int main()
{
    bool saidYes = false;
    string input;
    while (!saidYes)
    {
        cout << "Input yes or no: ";
        getline(cin, input);

        if (input == "no" || input == "n" || input == "NO")
        {
            saidYes = true; 
            cout << "you said no" << endl; 
        /* breaks the loop by changing the 
           bool (true or false flag) to true, if you want to produce a specific result,   
           whether it's a simple output statement or a function call you can put it here

        */
        }

        else if (input == "y" || input == "Y" || input == "yes" || input == "YES")
        {
            saidYes = true;
            cout << "You said yes" << endl;
        /* breaks the loop by changing the 
           bool (true or false flag) to true, if you want to produce a specific result, 
           whether it's a simple output statement or a function call you can put it here

        */
        }

        else saidYes = false;
   }

  return 0;
}

答案 2 :(得分:0)

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

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;
};

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