在字符串中的定界符之间删除字符
Deleting chars between a delimiter in a string
我想删除字符串中两个相同字符之间的所有字符。我的函数在其参数中采用字符串(通过引用)和一个字符。
假设我使用这样的 std::string
变量: "hah haaah hah hello!"
作为第一个参数,而char 'h'
作为第二个参数,则应该发生这样的事情: "hah haaah hah hello!" ===> "hh hh hh hello"
。如您所见,已删除了两个h
字符之间的每个字符。我如何实现这样的成就?
我尝试使用迭代器并最终以此为由:
void delete_chars_between(std::string& line, char del)
{
std::string::iterator itr_from = std::find(line.begin(), line.end(), del);
std::string::iterator itr_to = std::find(itr_from + 1, line.end(), del);
while (true) {
if(itr_to != line.end())
line.erase(itr_from + 1, itr_to);
itr_from = std::find(itr_to, line.end(), del);
if (itr_from == line.end())
break;
itr_to = std::find(itr_from + 1, line.end(), del);
if (itr_to == line.end())
break;
}
}
首先,我搜索del
的第一次出现,我将迭代器存储至itr_from
中的位置。之后,我搜索del
的第二次出现。最后,我运行了一段段循环,该循环首先要擦除特定范围内的字符,如果itr_to
有效。当我的迭代器不等于line.end()
时,我一遍又一遍地重复。
但是由于某种原因,此代码无法正常工作。有时它会删除空格,甚至不会触摸我要删除的字符。
感谢您的帮助。
std::string
迭代器均被所有修改字符串长度的操作无效,因此在呼叫line.erase
之后,使用itr_from
和itr_to
是不确定的行为。
您需要使用erase
的返回值:
while (true) {
if(itr_to != line.end())
itr_to = line.erase(itr_from + 1, itr_to);
itr_from = std::find(itr_to, line.end(), del);
if (itr_from == line.end())
break;
itr_to = std::find(itr_from + 1, line.end(), del);
if (itr_to == line.end())
break;
}
要避免不确定的行为,您应该在调用erase
之前重置两个迭代器。
查看预期的输出,似乎不应使用关闭定界符来启动另一个间隔:
"hh hh hh hello" not "hhhhhhhello"
^ ^ ^
所以,这是我的建议:
void delete_chars_between(std::string& line, char del)
{
std::string::iterator itr_from = std::find(line.begin(), line.end(), del);
// I don't want to pass an iterator to two past the last element
if ( itr_from == line.end() )
return;
std::string::iterator itr_to = std::find(itr_from + 1, line.end(), del);
// ^^^^
while ( itr_to != line.end() )
{
itr_to = line.erase(itr_from + 1, itr_to);
itr_from = std::find(itr_to + 1, line.end(), del);
// to start another couple ^^^^
if (itr_from == line.end())
break;
itr_to = std::find(itr_from + 1, line.end(), del);
}
}
在这里实时示例。
相关文章:
- 共享指针和具有自定义删除程序的唯一指针之间的语法差异背后的任何原因
- 当两者都调用时,删除和析构函数之间的区别?
- 删除[i] 数组和删除数组 [i] 之间的区别
- 文件删除(使用取消链接)与释放所有磁盘空间之间的延迟
- 删除字节数组 : Qt 缓冲区之间的空字符 (\x00)
- 如何删除字符串中的所有空格并将数据存储在两者之间
- 如何解决删除其他人之间共享的对象的问题
- 在特定情况下,指针删除和铸造之间的关系不清楚
- 在C 中的单词之间删除除一个空间以外的所有空间
- 如何删除给定索引之间的所有元素
- 当我删除数组时,指针在哪里?指向数组的指针与数组中的元素之间的区别
- 删除指针并将指针设置为null之间有什么区别
- 在字符串中的定界符之间删除字符
- 删除两个字符之间的文本
- C++:带有坐标的矢量.如何删除重复项以及它们之间的所有元素
- 删除字符串 c++ 中 < 和 > 符号之间的单词
- 对于空指针,删除程序的标准行为在 shared_ptr 和 unique_ptr 之间是否不同
- 如何删除抽象类中类似的 const 和非 const 成员函数之间的代码重复
- 删除 2 个给定索引之间的元素的最佳算法
- Qt Creator项目在生成之间删除Makefile