有人能解释为什么会这样吗?

时间:2018-01-23 20:27:45

标签: c++

这是一个大学项目,它所要做的就是向用户询问信息然后输出。这部分已经完成,所以项目已经完成(我不是在寻求学校工作的帮助)。

我决定为了好玩而添加更多内容。当用户输入任何内容时(我只是点击输入),我试图让它知道并告诉用户这样做并重新开始。在它开始不止一次之后,它输出最后一个" cout"然而很多时候用户没有回答某些事情(只需点击输入)。我无法弄清楚原因。

输出:

  

回答每个问题,以便让这个文字游戏正常运作。

     

你叫什么名字? 12

     

你多大了? 12

     你是哪里人? 12

     

你大学的名字是什么? 12

     

你的职业是什么? 12

     

你的宠物是什么类型的动物? 12

     

她/她的名字是什么? 12

     

曾经有一个名叫12岁的人住在12岁.12岁时,12岁12岁就读大学.12岁毕业,12岁就去上班。然后,12人采用了12个名为12岁的人。他们从此过上幸福的生活!

     

曾经有一个名叫12岁的人住在这里。在12岁时,12岁时12岁就读到了大学.12岁毕业并上班。然后,12人采用了一个名为12的(n)12。他们都过着幸福的生活!

     

曾经有一个名叫12岁的人住在12岁.12岁时,12岁12岁就读大学.12岁毕业,12岁就去上班。然后,12人采用了一个名为12岁的人。从此以后幸福快乐!

     

按任意键继续。 。

#include <iostream>
#include <string>
using namespace std;

int main()
{
    string name, city, college, prof, animal, petn;
    int age;

    // If no value is given for a question, start over.
    struct NoValue
    {
        static void check(string a, int cls = 100)
        {
            if (a.empty())
                {
                cout << "\n\nAnswers cannot be blank, let's try this again..." << endl;
                cin.get();      // Pause
                for (int i = 0; i <= cls; i++)  //
                    cout << "\n" << endl;               // Clear screen
                main();
            }
        }
    };

    cout << "Answer every question in order for this word game to work properly.\n\n";

    // Questions
    cout << "What is your name? ";
    getline(cin, name);

    cout << "How old are you? ";
    cin >> age;
    cin.ignore(); // To prevent the program from printing out the next 2 questions in the same line.

    cout << "Where are you from? ";
    getline(cin, city);

    cout << "What's the name of your college? ";
    getline(cin, college);

    cout << "What is your profession? ";
    getline(cin, prof);

    cout << "What type of animal is your pet? ";
    getline(cin, animal);

    cout << "and what is her/his name? ";
    getline(cin, petn);

    NoValue::check(name);
    NoValue::check(city);
    NoValue::check(college);
    NoValue::check(prof);
    NoValue::check(animal);
    NoValue::check(petn);

    cout << "\nThere once was a person named " << name << " who lived in " << city 
    << ".  At the age of " << age << ", " << name << " went to college at " << college 
    << ".  " << name << " graduated and went to work as a " << prof << ".  Then, " << name 
    << " adopted a(n) " << animal << " named " << petn << ".  They both lived happily ever after!\n\n" << endl;

    return 0;
}

3 个答案:

答案 0 :(得分:1)

你写道:
“我无法弄明白为什么。”; 所以我假设问题是:
“你们能帮助我弄清楚发生了什么事情,以便找到解决办法吗?”

如果是这种情况,现在就是这样。

主要首次启动(让我们将此命名为FIRST_MAIN)。

在FIRST_MAIN中,“用户”在执行行时错过了动物类型

cout << "What type of animal is your pet? ";
    getline(cin, animal);

但是FIRST_MAIN继续执行并开始检查用户输入 当FIRST_MAIN开始执行行

NoValue::check(animal);

在检查方法(动物类型)中,FIRST_MAIN打印错误信息,清除屏幕并启动A SECOND_MAIN。

  

注意:现在运行FIRST_MAIN的SECOND_MAIN ID正在等待   为SECOND_MAIN完成。记住FIRST_MAIN必须这样做   完成检查方法并继续执行剩余的行

我们假设现在(在SECOND_MAIN中)用户做了一切正确的事,所有检查都没问题。
现在SECOND_MAIN打印出故事,SECOND_MAIN到达行

return 0

谁打电话给SECOND_MAIN?
它是FIRST_MAIN,称为SECOND_MAIN!
所以SECOND_MAIN唤醒正在等待SECOND_MAIN完成的FIRST_MAIN。

因此,FIRST_MAIN将继续从

执行行
main();
在check函数内部(FIRST_MAIN称为SECOND_MAIN)。

现在,FIRST_MAIN完成检查(对于错过的动物类型)并继续下一行

NoValue::check(petn);

在这里,FIRST_MAIN打印出了MISSING动物类型的故事。

我认为现在你已经知道发生了什么 如何解决这个问题?这是另一个问题: - )

答案 1 :(得分:0)

你有方法检查,它检查空白输入,如果是空白,则调用main。问题是,一旦完成,它将从调用check的地方恢复。我建议检查返回bool,指示是否继续检查和打印,如下所示:

if(!NoValue::check(name))
    return 0;

答案 2 :(得分:0)

如果输入的字符串是数字,只需检查strtol。 如果是数字,则仅在询问when数值时才存储该值,否则返回错误。 如果询问字符串值但是用户inser数值则给出错误。

Here strtol

的参考资料