C++ C++;字符串流忽略()不工作
我在解决一个关于hackerrank的问题时遇到了这个涉及字符串流的问题 对于提取数据,hackerrank给出了一个示例:C++ C++;字符串流忽略()不工作,c++,stringstream,C++,Stringstream,我在解决一个关于hackerrank的问题时遇到了这个涉及字符串流的问题 对于提取数据,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
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();
}
stringstreamss(str);
向量向量;
int i;
while(ss>>i)
{
向量推回(i);
如果(ss.peek()==',')
忽略();
}
为什么我不能在这里使用提取操作来获取所需的单词?流是否应该转义“,”(很抱歉出现noob级别的问题)?
操作符>
仅当字符实际属于请求的数据类型时,才提取下一个带分隔符的标记。因此,当使用操作符>
读取int
时,它将只提取数字,而不是字母、标点符号等。这意味着必须单独读取数字后面的逗号
在第一个示例中:
ss>>a
读取流中的第一个int
>ch
读取它后面的逗号>b
读取下一个int
>ch
读取它后面的逗号>c
读取下一个int
ss>>i
读取流中的下一个int
,如果失败或EOF,则中断循环ss.peek()
运算符>>
读取不存在的逗号,它将设置流的eofbit
状态并使提取失败。如果使用while(ss>>i>>ch)
,while
将在达到最后一个int
时计算为false
。即使ss>>i
会成功,>ch
也会失败,因此i
不会被添加到向量中
理论上,如果(ss.peek()==',')ss.ignore(),您可以替换代码>在循环内,使用字符ch;ss>>ch
取而代之。至少对于像“23,4,56”
这样的字符串,结束效果是相同的。但是,假设你得到了类似于“23 4 56”
的东西。第一个示例无法正确处理该问题,但第二个示例在使用peek()+ignore()
时处理得很好,但在使用ss>>ch
operator>
时处理得不好,仅当字符实际属于请求的数据类型时。因此,当使用操作符>
读取int
时,它将只提取数字,而不是字母、标点符号等。这意味着必须单独读取数字后面的逗号
在第一个示例中:
ss>>a
读取流中的第一个int
然后,>ch
读取它后面的逗号
然后>b
读取下一个int
然后,>ch
读取它后面的逗号
然后>c
读取下一个int
在第二个例子中:
ss>>i
读取流中的下一个int
,如果失败或EOF,则中断循环
然后ss.peek()
后藤1号
如果尝试使用运算符>>
读取不存在的逗号,它将设置流的eofbit
状态并使提取失败。如果使用while(ss>>i>>ch)
,while
将在达到最后一个int
时计算为false
。即使ss>>i
会成功,>ch
也会失败,因此i
不会被添加到向量中
理论上,如果(ss.peek()==',')ss.ignore(),您可以替换代码>在循环内,使用字符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));
}
我想你可以用这个代码来逃避“,”
std::string valstr;
while (std::getline(ss, valstr, ','))
{
vect.push_back(std::stoi(valstr));
}
你明白ch在第一段代码中做了什么吗?我显然不明白。我以为它默认为“,”定界,但雷米睁开了我的眼睛。你明白第一个代码片段中的>ch
在做什么吗?我显然不明白。我以为它默认为“,”划界,但雷米睁开了我的眼睛。非常感谢你的回答。非常直观。非常感谢您的回答。非常直观。谢谢你的回答!谢谢你的回答!直到。