如何检查用户输入是1还是2

时间:2018-05-23 12:31:29

标签: c++ if-statement

我想让用户输入一个代表难度的数字但是当我使用if语句检查难度是否为1时,if内的代码块永远不会被执行输入1

与问题的答案相同。

例如,当我运行代码并且它要求我输入难度并输入2或1000时,它仍继续执行代码。即使我输入1945年第一个错误的问题,它只会显示you got it correct的答案。

非常感谢任何帮助!

代码:

int difficulty;
cout << "Please choose a difficulty: 1 for easy 2 for medium 3 for hard: ";
cin >> difficulty;

if (difficulty = '1')
{
    ifstream file_("questions.txt");
    if (file_.is_open())
    {
        std::getline(file_, ques1);
        cout << ques1 << std::endl;
        int answr1;
        cout << "Enter 1 for: 1945, Enter 2 for: 1914 \n";
        cin >> answr1;
        if (answr1 = '1914')
        {
            cout << "Well done you got it correct! \n";
        }
        else {
            cout << "Incorrect answer was 1914! \n";
        }

        std::getline(file_, ques2);
        cout << ques2 << std::endl;
        int answr2;
        cout << "Enter 1 for: 1937, Enter 2 for: 1939 \n";
        cin >> answr2;
        if (answr2 = '1939')
        {
            cout << "Well done you got it correct! \n";

        }
        else {
            cout << "The answer was 1939 \n";
        }

        std::getline(file_, ques3);
        cout << ques3 << std::endl;
        int answr3;
        cout << "Enter 1 for: George Bush, Enter 2 for: George Washington \n";
        cin >> answr3;
        if (answr3 = '2')
        {
            cout << "Well done you got it correct! \n";
        }
        else {
            cout << "It was George Washington \n";
        }

        std::getline(file_, ques4);
        cout << ques4 << std::endl;
        int answr4;
        cout << "Enter 1 for: 14, Enter 2 for: 11 \n";
        cin >> answr4;
        if (answr3 = '11')
        {
            cout << "Well done you got it correct! \n";
        }
        else {
            cout << "It was 11 \n";
        }

        std::getline(file_, ques5);
        cout << ques5 << std::endl;
        int answr5;
        cout << "Enter 1 for: She was born with 6 figners , Enter 2 for: 6 toes \n";
        cin >> answr5;
        if (answr3 =' 2')
        {
            cout << "Well done you got it correct! \n";
        }
        else {
            cout << "It was 6 Toes \n";
        }

        file_.close();
    }
    else {
        cout << "File is not open\n";
    }

}

3 个答案:

答案 0 :(得分:0)

你的if语句在你的逻辑上是有缺陷的。你希望用户在两个选项之间进行选择,所以如果他们选择1或2以外的任何东西给他们提示并期待这两个答案中的一个。参见下面的例子:

 if (answr1 == "1914")
        {
            cout << "Well done you got it correct! \n";
        }
        else if(answr1 == '1945') {
            cout << "Incorrect answer was 1914! \n";
        }
        else {
            cout << "Incorrect Input!Plese input 1 or 2 \n";
        }

P.S:在C ++中=运算符用于赋值。使用==进行比较

答案 1 :(得分:0)

要进行相等比较,请使用:==

if(difficulty==1)
{
    cout << "You selected difficulty 1" << std::endl;
}

如果你这样做

if(difficulty=1)
{
    cout << "You selected difficulty 1" << std::endl;
}

1分配给难度。检查if条件(在这种情况下检查变量不为0),因此始终满足。

答案 2 :(得分:0)

首先(建议!),您正在处理用户输入。您应该始终考虑用户输入不正确的可能性!

int n;
std::cin >> n;

如果用户键入e。 G。 &#39; x&#39;,流进入无效状态,您再也无法成功阅读其他任何内容。因此,在每次输入后,您应该检查流:

if(!std::cin)
{
    // print some error message?

    // reset the error state!
    std::cin::clear();
    // skip whatever yet is buffered in the stream
    std::cin.ignore(std::numeric_limits<std::streamsize>::max())
    // now std::cin is ready to use again...
}

你可以在循环中执行此操作,对输入进行进一步检查,只有在有效时才退出...尝试创建函数以避免代码重复。

int difficulty;
std::cin >> difficulty;
if (difficulty = '1')    // << !!!

一次出现两个错误:单个等号不是比较,而是作业!所以你要分配角色的值&#39; 1&#39; (在数字上不是1!)变量difficulty - 然后检查此赋值的结果。由于变量现在得到的值不是0(零),因此将输入if块 - 始终。为了比较,您需要使用:

if(difficulty == '1')
//            ^^

好的,仍然是值:'1'是一个字符文字,而不是数字文字。最有可能的是,您在前128个字符上使用的字符集与ASCII兼容,如果是,'1' 对应于49的数值。很确定这不是你想要的......所以:

if(difficulty == 1)
//               ^ integer literal, numerical value!

或者,您可以阅读一个字符:

char difficulty;         // different type!
std::cin >> difficulty;
if (difficulty = '1')

现在读取一个简单的字符而不进行任何转换,而读入int会将一个或更多(!)字符转换为数值。如果没有转换,字符输入保持不变,您可以与字符值进行比较......

 int answr1;
 cin >> answr1;
 if (answr1 = '1914')

同样如此,但是,现在,您使用的是无效的字符文字!

您可以与字符串进行比较,如果有的话:

 std::string answr1;
 cin >> answr1;
 if (answr1 == "1914")

或再次作为整数,如上所述(if(a == 1914))。另一方面,虽然:

std::cout << "Enter 1 for: 1945, Enter 2 for: 1914 \n";

以上比较要求用户不要输入2以获得正确答案,而是1914!因此,您宁愿与选项进行比较:

 if(answr1 == 2)

最后,还有一些建议:您将文本文件中的问题与代码中的静态链接响应选项相结合。那么,你的文本文件是徒劳的......

您也可以尝试从文件中拖出答案。进一步的优势:您可以通过使用循环来避免重复代码,并且可以针对不同文件中的不同困难组织您的问题。您的代码可能看起来与此代码类似:

std::ifstream file;
std::cin >> difficulty;
switch(difficulty)
{
case 1:
    file.open("question_1.txt");
    break;
case 2:
case 3:
     // ...
     break;
default:
    // invalid input! -> appropriate handling
    break;
}

std::string text;
for(;;)
{
    std::getline(file, text);
    // the question text:
    std::cout << text << std::endl;
    // the answer options:
    std::getline(file, text);
    std::cout << text << std::endl;
    // read the correct answer:        
    std::getline(file, text);
    int answer; // parse appropriately from text!
    // read the text for output, if users answer was not correct!
    std::getline(file, text);

    // now read in user input and compare against correct answer...
}

文件格式现在非常明显:对于每个问题四行,内容如上所述。您可能会发明更复杂的东西甚至使用XML,但就目前而言,它应该足够......

好吧,你仍然需要正确地确定文件的结尾并且如果到达则退出循环,将此作为练习给你...