0

我正在尝试解析字符串输入,而我的解析方式并没有按照我想要的方式运行。我看不到哪里出错了,希望您能指导我一下。

输入是一系列三重字符串输入,如下所示

1 4 1 2
1 2 2 4
1 2 4 2

输入由我无法控制的服务提供。在行尾没有多余的空格,例如行是1 4 1 2, 句号。我目前解析输入的方式是

string line;
while (getline(cin, line) && !line.empty()) input += line;

在我完成解析输入后出现问题,它变成

1 4 1 21 2 2 41 2 4 2
      --     --

我通过在解析结果中强调问题出现的地方来强调它。如您所见,下一行的第一个数字与第一个数字连接。这会导致输入无法用于进一步处理,因为2141是意外输入。

我希望输入解析的结果是

1 4 1 2 1 2 2 4 1 2 4 2

我试图通过传入一个输入来手动重现这一点,我在每行之后手动添加空格,这会产生我想要的结果,但是看到服务没有这样做,我对如何继续感到有点茫然。

感谢您抽出宝贵时间阅读本文并提供您可以提供的任何帮助。

4

1 回答 1

0

getline 在 istream 上运行。它读取 istream,直到遇到分隔符或文件结尾。它使用直到分隔符(不包括分隔符)的所有字符填充字符串,并将流前进到分隔符之后的位置。您已经逐行获得输入,但随后将缺少分隔符的每一行重新连接起来。您正在获得带有换行符的数据,但您正在丢弃它。你想对数据做什么?

逐行操作输入数据的规范方法是利用您传递给它的返回值getlineistream并进一步利用istream可转换为布尔值的优势。您不需要检查该行是否为空,除非您的输入包含空行(一行中的多个换行符)是有效的。

你可能想要的是这样的:

std::string line;
while (std::getline(std::cin, line))
{
  // do something with the line here
}
于 2020-10-11T16:02:18.107 回答