是否可以在同一条线上一个接一个地使用cin和getline?

时间:2014-11-05 20:17:00

标签: c++ cin getline

我的输入是一行,例如:

12345 14 14 15 15

其中12345是学生的身份证号码,其大小可能不同,其余的输入是学生的分数。从这一行开始,我试图将id存储到一个变量中,然后将我将转换为int数组的分数转换为另一个变量。我尝试过这样的事情:

int id;
std::string scores;
std::cin >> id;
std::cin.ignore(' '); //ignore the space after the id number
std::getline(std::cin, scores); //store the rest of the line into scores

这似乎并没有起作用。这样的事情可能吗?

我认为我可以使用子字符串来分隔这两个部分,但由于id号的长度可能会有所不同,所以我不认为我能够。

解决我想要做的事情的最佳方法是什么?对不起,如果这是微不足道的;我还是C ++的初学者。

2 个答案:

答案 0 :(得分:2)

std::basic_istream::ignore()没有按照您的想法行事。如果你咨询suitable reference,你会发现第一个参数是要忽略的字符数,第二个参数是分隔符。您基本上要求它忽略32个字符(因为32是空格的ASCII代码)。

你想要这个:

int id;
std::string scores;
std::cin >> id;
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), ' '); //ignore all characters until a space is found
std::getline(std::cin, scores); //store the rest of the line into scores

或者,如果你知道它之后总会只有一个空格,只需在没有参数的情况下调用std::cin.ignore();,因为这意味着忽略1个字符。

答案 1 :(得分:2)

我不确定什么不起作用,但我当然不会使用ignore()来忽略分隔空间。相反,我只是使用

std::getline(std::cin >> id >> std::ws, scores);

操纵器std::ws将忽略所有空格。