C 字符串流ignore()不起作用
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()
跳过它 - 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));
}
相关文章:
- 我的神经网络不起作用 [XOR 问题]
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- C++为什么尽管我调用了void函数,它却不起作用
- 为什么在保护模式下继承升级不起作用
- 循环在计数器中不起作用
- 在其他文件中创建类时在 c++ 项目中不起作用
- Visual studio代码重构似乎不起作用(例如,重命名符号-f2)
- 为什么二进制搜索在我的测试中不起作用
- 我的代码中有错误吗?使用BGI图形的C++代码对我不起作用
- 为什么 const std::p air<K,V>& 在 std::map 上基于范围的 for 循环不起作用?
- 带有指定长度字符* 参数的 std::regex_search 在 VS2017 中不起作用?
- Bjarne Stroustrup Book - std_lib_facilities.h - 不起作用(未知类型名称)
- 为什么简单的算术减法在"if"条件下不起作用?
- CIN被跳过,Cin.ignore不起作用
- QWheelEvent::ignore() 在提升的 QLineEdit 中不起作用?
- C 字符串流ignore()不起作用
- cin.clear() 和 cin.ignore() 不起作用
- cin.ignore() 在程序中不起作用
- 在 Ctrl+Z (EOF) 之后从 iostream::cin 恢复读取?("ignore"不起作用)