我会知道在不使用 boost的情况下使用 std::string 的最佳方法和最简单的方法。
例如如何转换这个字符串
" a b c d e '\t' f '\t'g"
在
"a b c d e f g"
假设 '\t' 是一个正常的表格。
谢谢。
使用字符串流的惰性解决方案:
#include <string>
#include <sstream>
std::istringstream iss(" a b c d e \t f \tg");
std::string w, result;
if (iss >> w) { result += w; }
while (iss >> w) { result += ' ' + w; }
// now use `result`
您没有定义“epur”的含义,但该示例使其看起来像您想要的是删除前导(和尾随?)空格并用单个空格替换内部空格。现在您可以使用 std::replace_if、std::uniqiue 和 std::copy_if 的组合来执行此操作,但这非常复杂,并且最终会多次复制数据。如果你想用一次就地完成,一个简单的循环可能是最好的:
void epur(std::string &s)
{
bool space = false;
auto p = s.begin();
for (auto ch : s)
if (std::isspace(ch)) {
space = p != s.begin();
} else {
if (space) *p++ = ' ';
*p++ = ch;
space = false; }
s.erase(p, s.end());
}
看起来您想\t
从字符串中删除字符。您可以通过复制不\t
如下的字符来做到这一点:
#include <iostream>
#include <string>
#include <algorithm>
#include <iterator>
int main()
{
std::string s1( "a b c \t d e f \t" );
std::string s2;
std::copy_if( std::begin(s1),
std::end(s1),
std::back_inserter<std::string>(s2),
[](std::string::value_type c) {
return c != '\t';
} );
std::cout << "Before: \"" << s1 << "\"\n";
std::cout << "After: \"" << s2 << "\"\n";
}
输出:
Before: "a b c d e f "
After: "a b c d e f "
如果要从字符串中删除所有空格,请将return
语句替换为
return !std::isspace(c);
(isspace在标头cctype中)