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
时,它只会提取数字,不会提取字母、标点符号等。这意味着必须单独读取数字后面的逗号。
在第一个例子中:
ss >> a
读取流中的第一个 int
- 然后
>> ch
读取它后面的逗号
- 然后
>> b
读下一个int
- 然后
>> ch
读取它后面的逗号
- 然后
>> c
读下一个int
在第二个例子中:
ss >> i
读取流中的下一个 int
,如果失败或 EOF 则中断循环
- 然后
ss.peek()
检查逗号是否存在(因为最后一个 int
没有逗号),如果找到则 ss.ignore()
跳过它
- 转到 #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));
}
我在解决一个关于 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
时,它只会提取数字,不会提取字母、标点符号等。这意味着必须单独读取数字后面的逗号。
在第一个例子中:
ss >> a
读取流中的第一个int
- 然后
>> ch
读取它后面的逗号 - 然后
>> b
读下一个int
- 然后
>> ch
读取它后面的逗号 - 然后
>> c
读下一个int
在第二个例子中:
ss >> i
读取流中的下一个int
,如果失败或 EOF 则中断循环
- 然后
ss.peek()
检查逗号是否存在(因为最后一个int
没有逗号),如果找到则ss.ignore()
跳过它 - 转到 #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));
}