C++中的cin输入不起作用?

5
#include <iostream>
#include <string>

struct Car{
    std::string model;
    unsigned int year;
};

int main(){
    using namespace std;

    int carNum;
    cout << "How many cars do you wish you catalog? ";
    cin >> carNum;
    Car * cars = new Car[carNum];

    for (int i=0;i<carNum;i++){
        cout << "Car #" << i << endl;
        cout << "Please enter the make: ";
        getline(cin, cars[i].model);

        cout << "Please enter the year made: ";
        cars[i].year = cin.get();
    }

    cout << "Here's your collection" << endl;

    for (int i=0;i<carNum;i++){
        cout << cars[i].model << " " << cars[i].year << endl;
    }

    delete [] cars;

    return 0;
}

当我执行程序时,getline(cin, car[i].model) 却被跳过了。为什么会这样?
Car #2
Please enter the make: Please enter the year made:

你说的“skipped over”是什么意思? - user349026
当你说“只是被跳过了”时,你需要更清楚。几乎可以确定代码正在执行。请描述症状,即cars[i].model是否始终为空? - Arelius
2个回答

13

简单的原因。

当您执行cin >> whatever时,将留下一个\n(按Enter键时添加)。默认情况下,getline读取到下一个\n,因此下一次读取将仅读取空字符串。

解决方案是丢弃该\n。您可以通过添加以下内容来实现:

cin.ignore(numeric_limits<streamsize>::max(),'\n');

cin >> carNum 之后。

别忘了包含 limits 库才能使用 numeric_limits


哦,是的。我也可以这样做:(cin >> carNum).get(); - Pwnna
或者如果您不想过于追求严谨,可以写一个相当大的数字,而不是numeric_limits blah blah max。 - Zan Lynx
3
不拘泥于细节的问题在于代码最终会出现错误。虽然这个程序很简单,所以现在可能不会有影响,但我们需要鼓励而不是嘲笑追求严谨的习惯,因为它总有一天会变得重要。 - Martin York
3
@ultimate buster,如果我现在键入“34 <回车>”会发生什么?你的获取将读取空格并导致代码中断。 - Martin York

0

在每次使用插入运算符的cin调用之后,如果您想要cin.getline()正常工作,则必须调用cin.ignore()

因为当您按下Enter键时,cin>>会留下一个'\n'字符,因此当您使用getline()时,它会捕获\n并且不会接受任何输入,因为它在输入流中找到了\n,这是默认的分隔符。

因此,您可以在每个cin>>之后执行cin.ignore(),或者简单地设置一个分隔符字符cin.getline()


这个答案与@EtienneDeMartel在2011年5月4日1:14的答案有何不同? - scopchanov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接