1

我会知道在不使用 boost的情况下使用 std::string 的最佳方法和最简单的方法。

例如如何转换这个字符串

"  a   b          c  d     e '\t' f      '\t'g"

"a b c d e f g"

假设 '\t' 是一个正常的表格。

谢谢。

4

3 回答 3

6

使用字符串流的惰性解决方案:

#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`
于 2012-07-20T20:51:14.020 回答
2

您没有定义“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());
}
于 2012-07-20T21:47:24.177 回答
0

看起来您想\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中)

于 2012-07-20T20:49:37.213 回答