C 字符串流ignore()不起作用

C++ String stream ignore() not working

本文关键字:不起作用 ignore 字符串      更新时间:2023-10-16

我在hackerrank上解决了一个问题,并遇到了涉及字符串流的问题。

https://www.hackerrank.com/challenges/c-tutorial-stringstream/problem

用于提取数据,Hackerrank给出了一个示例:

stringstream ss("23,4,56");
char ch;
int a, b, c;
ss >> a >> ch >> b >> ch >> c;  // a = 23, b = 4, c = 56

但是,当我尝试将其导出到向量时,我必须逃脱'',''

stringstream ss(str);
vector<int> vect;
int i;
while (ss >> i)
{
vect.push_back(i);
if (ss.peek() == ',')
    ss.ignore();
}

为什么我不能使用提取操作在此处获取所需的单词?流不应该逃脱''(对不起,菜鸟级问题)?

operator>>提取下一个界定令牌,只有字符实际属于请求的数据类型。因此,当使用operator>>读取int时,它将仅提取数字,而不是字母,标点等。这意味着必须单独读取数字的逗号。

在第一个示例中:

  1. ss >> a在流中读取第一个int
  2. 然后 >> ch读取逗号
  3. 然后>> b读取下一个int
  4. 然后 >> ch读取逗号
  5. 然后>> c读取下一个int

在第二个示例中:

  1. ss >> i在流中读取下一个 int,如果失败或eof
  2. ,则打破循环
  3. 然后ss.peek()检查逗号是否存在(因为最后一个int没有一个),如果找到了逗号,则ss.ignore()跳过它
  4. goto#1

如果您尝试使用operator>>读取不存在的逗号,它将设置流的eofbit状态并使提取失败。如果您使用while (ss >> i >> ch),当达到最后一个int时,while将评估为false。即使ss >> i成功,>> ch也会失败,因此i不会添加到vector中。

从理论上讲,您可以改用char ch; ss >> ch在循环内替换if (ss.peek() == ',') ss.ignore();。最终效果将是相同的,至少对于诸如"23,4,56"之类的字符串。但是,假设您得到了类似"23 4 56"的东西。第一个示例将无法正确处理,但是第二个示例在使用peek()+ignore()时可以很好地处理它,但是当使用ss >> ch

时不会

我想您可以使用此代码逃脱'''

std::string valstr;
while (std::getline(ss, valstr, ','))
{
    vect.push_back(std::stoi(valstr));
}