取第一个字符串输入然后忽略其余的

时间:2012-05-10 17:28:08

标签: c++ string input getline

我希望用户输入一个字符串,double和long,但事情是在第一次之后,字符串被忽略并留空并直接提示输入。

这是我的代码:

#include <iostream>
#include <string>

using namespace std;

int main () {
    string name;
    double price;
    long serial;

    cout << "Enter the dvd's name: "; getline(cin, name);
    cout << "Enter the dvd's price (in $): "; cin >> price;
    cout << "Enter the dvd's serial number: "; cin >> serial;

    cout << endl;

    cout << "Enter the dvd's name: "; getline(cin, name);
    cout << "Enter the dvd's price (in $): "; cin >> price;
    cout << "Enter the dvd's serial number: "; cin >> serial;

    return 0;
}

the console of the code

你可以看到第一次,我可以输入一个字符串,第二次只是直接发送给我的双倍,即使我忽略了丢失的字符串,并把一个双倍然后一个长,它将打印名称为空字符串。

我的代码出了什么问题?

2 个答案:

答案 0 :(得分:1)

序列号后的空白(回车或空格)未被检索,然后getline将其取出。

编辑:正如johnathon所指出的那样,cin >> ws在这种情况下无法正常工作(我确定我之前使用过这个,但我找不到一个例子)

经过测试的解决方案:而是在序列号之后添加此项将从流中获取回车符(以及任何其他空格),以便为下一个DVD名称做好准备。

string dummy;
getline(cin, dummy);

答案 1 :(得分:1)

在这种情况下我通常使用istringstream(如下所示)。但更好的解决方案是使用cin.ignore

#include <sstream>

int main () {
    string name,line;
    double price;
    long serial;

    cout << "Enter the dvd's name: "; getline(cin, line);
    name = line;
    cout << "Enter the dvd's price (in $): ";
    getline(cin,line);
    istringstream(line)>>price;
    cout << "Enter the dvd's serial number: ";
    getline(cin,line);
    istringstream(line)>>serial;
    cout << endl;
    return 0;

}