【问题标题】:C++ String stream ignore() not workingC ++字符串流忽略()不起作用
【发布时间】:2018-03-10 21:05:22
【问题描述】:

我正在解决一个关于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();
}

为什么我不能在这里使用提取操作来获取所需的单词?流不应该逃避','(对于菜鸟级别的问题感到抱歉)?

【问题讨论】:

  • 你明白&gt;&gt; ch在第一个代码sn-p中做了什么吗?
  • 我显然没有。我以为它默认为 ',' 定界,但 Remy 让我大开眼界。

标签: c++ stringstream


【解决方案1】:

operator&gt;&gt; 提取下一个分隔标记,仅当字符实际上属于请求的数据类型时。因此,当使用operator&gt;&gt; 读取int 时,它只会提取数字,而不是字母、标点符号等。这意味着必须单独读取数字后面的逗号。

在第一个例子中:

  1. ss &gt;&gt; a 读取流中的第一个 int
  2. 然后&gt;&gt; ch 读取它后面的逗号
  3. 然后&gt;&gt; b 读取下一个int
  4. 然后&gt;&gt; ch 读取它后面的逗号
  5. 然后&gt;&gt; c 读取下一个int

在第二个例子中:

  1. ss &gt;&gt; i 读取流中的下一个 int,如果失败或 EOF 则中断循环
  2. 然后ss.peek() 检查是否存在逗号(因为最后一个int 没有逗号),如果找到则ss.ignore() 跳过它
  3. 转到 #1

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

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

【讨论】:

  • 非常感谢您的回答。非常直观。
【解决方案2】:

我认为您可以使用此代码来转义“,”

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

【讨论】:

  • 感谢您的回答!直到。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-30
  • 1970-01-01
  • 2020-01-18
  • 1970-01-01
相关资源
最近更新 更多