【问题标题】:getline takes only a piece of the informationgetline 只取一部分信息
【发布时间】:2014-03-11 02:14:39
【问题描述】:
class MovieData
{
private:
    string Title;
    string Director;
    int Year;
    int Time;

public:
    MovieData();
    void setTitle(string Title);
    void setDirector(string Director);
    void setYear(int Year);
    void setTime(int Time);
    string getTitle();
    string getDirector();
    int getYear();
    int getTime();
};

MovieData::MovieData()
{
    Title = "";
    Director = "";
    Year = 0;
    Time = 0;
}    

void MovieData::setTitle(string title)
{
    Title = title;
}    

void MovieData::setDirector(string director)
{
    Director = director;
}

void MovieData::setYear(int year)
{
    Year = year;
}

void MovieData::setTime(int time)
{
    Time = time;
}

string MovieData::getTitle()
{
    return Title;
}

string MovieData::getDirector()
{
    return Director;
}

int MovieData::getYear()
{
    return Year;
}

int MovieData::getTime()
{
    return Time;
}

void readMovieData(MovieData *, int);
void MovieDatastats(MovieData *, int);

这是我这里的类、定义和函数原型....它们都在同一个main.cpp中 这是我的身体

int main()
{
    int amount = 0;
    cout << "How many movies did you watch last month? ";
    cin >> amount;

    MovieData *pMovie;
    pMovie = new MovieData[amount];

    cout << "Please enter the information of your Movies!" << endl;
    readMovieData(pMovie, amount);

    cout << "\nHere are the information with your Movies!" << endl;
    MovieDatastats(pMovie, amount);

}

对于那些之前一直在帮助我的人,我通过我的原型函数修复了它。当不需要时,我将 (MovieData *pMovie, int const size) 作为参数。非常感谢您的帮助! 我不需要两次调用同一个对象,它相互冲突。 现在,这是我一直坚持的功能,我不知道为什么......

void readMovieData(MovieData *pMovie, int const size)
{
    string title;
    string director;
    int year;
    int time;

    for(int i = 0; i < size; i++)
    {
        cout << "\nPlease enter the Title of the movie: ";
        getline(cin,title);
        pMovie[i].setTitle(title);

        cin.ignore();

        cout << "Please enter the Director name of the movie: ";
        getline(cin,director);
        pMovie[i].setDirector(director);

        cin.ignore();

        cout << "Please enter the year it was released: ";
        cin >> year;
        if(year >= 1900 && year <= 2004)
            pMovie[i].setYear(year);
        else
        {
            cout << "\nPlease enter a year between 1900 and 2004." << endl;
            year = 0;
            system("PAUSE");
            break;
        }

        cout << "Please enter the time the movie last: ";
        cin >> time;
        if(time > 0 && time < 14400)
            pMovie[i].setTime(time);
        else
        {
            time = 0;
            cout << "\nPlease enter a time between 0 and 14400 in minutes." << endl;
            system("PAUSE");
            break;
        }
    }
}

void MovieDatastats(MovieData *pMovie, int const size)
{
    float sumTime = 0.0;
    float averageTime = 0.0;
    for (int i = 0; i < size; i++)
    {
        sumTime +=pMovie[i].getTime();
    }
    averageTime = sumTime/size;

    cout << "\nYour average time of all your movie is: " << averageTime << endl;

    int oldYear = 0;
    int count = 0;
    int recentYear = 0;
    int counter = 0;

    oldYear = pMovie[0].getYear();
    recentYear = pMovie[0].getYear();

    for (int j = 1; j < size; j++)
    {
        if(pMovie[j].getYear() < oldYear)
        {
            oldYear = pMovie[j].getYear();
            count = j;
        }
        else if(pMovie[j].getYear() > recentYear)
        {
            recentYear = pMovie[j].getYear();
            counter = j;
        }
    }

    cout << "\nThe oldest Movie you have watched is called..." << endl;
    cout << "Title: " << pMovie[count].getTitle() << endl;
    cout << "Director: " << pMovie[count].getDirector() << endl;
    cout << "Release Year: " << pMovie[count].getYear() << endl;

    cout << "\nThe most newest Movie you have watched is called..." << endl;
    cout << "Title: " << pMovie[counter].getTitle() << endl;
    cout << "Director: " << pMovie[counter].getDirector() << endl;
    cout << "Release Year: " << pMovie[counter].getYear() << endl;
}

一旦我运行程序并输入信息,我可以输入标题和导演的名字,但是一旦我到了当我得到年份时,程序将不再接受任何内容并结束。从下面的输出中我们可以看到,它跳过了 Title,并拿走了单词的第一个字母。我该如何解决这个问题?

这是我的输出。

你上个月看了几部电影? 2

请输入您的电影信息!

请输入电影名称:鲨鱼袭击

请输入电影导演姓名:随机姓名

请输入发布年份:

请输入介于 1900 和 2004 之间的年份。

按任意键继续。 . .

这里是您的电影的信息!

你所有电影的平均时间是:0

你看过的最老的电影叫...

标题:

导演:听攻击

发布年份:0

你看过的最新电影叫...

标题:

导演:听攻击

发布年份:0

进程返回 0 (0x0) 执行时间:19.781 s 按任意键 继续

.

【问题讨论】:

    标签: c++ getline


    【解决方案1】:

    cin &gt;&gt; amount; 之后,流中还有一个新行,所以在调用getline(cin,title) 时,新行将分配给titletitle 将为空。然后使用默认参数调用ignore()streamsize n = 1, int_type delim = traits_type::eof(),如果程序没有收到 EOF,它将丢弃您输入的一个字符。您无需在getline() 之后调用ignore()
    删除所有cin.ignore();并在getline(cin, title);上方添加这一行:cin.ignore(A_BIG_NUMBER, '\n');,它将起作用。

    【讨论】:

    • 单个输入不会破坏getline函数,在getline之后你需要一个cin.ignore()来重置输入值。
    • 您需要在调用getline() 之前调用std::cin.ignore(10000, '\n'); 忽略新行。尝试调试,你会看到。
    • 谢谢!现在工作正常!你能解释一下 cin.ignore(10000, '\n') 函数吗,所以我可以学习 =)
    • 看看这个link
    【解决方案2】:

    你正在用 system("PAUSE") 之后的 break 来打破 for 循环

    【讨论】:

    • 如果它不起作用,我会破坏它。如果它有效,它将跟进
    猜你喜欢
    • 2011-01-09
    • 1970-01-01
    • 2015-10-23
    • 2023-03-15
    • 2015-06-05
    • 1970-01-01
    • 1970-01-01
    • 2015-06-25
    • 1970-01-01
    相关资源
    最近更新 更多