C ++字符串流忽略()不起作用

C++ String stream ignore() not working

我在解决一个关于 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. 转到 #1

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

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

时则不然

我想你可以使用这段代码来转义 ','

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