在C ++中删除单词之间除一个空格外的所有空格

时间:2019-02-26 07:04:25

标签: c++

我需要删除单词之间除一个空格外的所有空格。我遍历字符串,if (temp.back() == ' ' && c != ' ')在进入下一个单词之前先检查最后一个空格。但这会删除所有空白。任何提示问题出在哪里?

string removeWhiteSpace(string current)
{
  string myNewString = "";
  string temp = "";
  for (char c : current)
  {
    temp.push_back(c);
    if (temp.back() == ' ' && c != ' ')
    {
      myNewString.push_back(' ');
    }
    if (c != ' ')
    {
      myNewString.push_back(c);
    }
  }
  return myNewString;
}

3 个答案:

答案 0 :(得分:2)

问题出在有条件的

if (temp.back() == ' ' && c != ' ')

如果最后一个字符不是空格并且c是空格,则要添加空格:

if (temp.back() != ' ' && c == ' ')

(您颠倒了==!=运算符)。

此外,您还需要在此条件块之后按下新字符c(否则temp.back()c将始终是同一字符)。

最后,字符串temp开头是空的,不允许调用back(),您应该使用非空的值来初始化它(例如temp = "x")。

因此,最终起作用的功能是:

string removeWhiteSpace(string current)
{
  string myNewString = "";
  string temp = "x";
  for (char c : current)
  {
    if (temp.back() != ' ' && c == ' ')
    {
      myNewString.push_back(' ');
    }
    temp.push_back(c);
    if (c != ' ')
    {
      myNewString.push_back(c);
    }
  }
  return myNewString;
}

答案 1 :(得分:0)

您可能希望删除多余的空格。这段代码会有所帮助。

string removeWhiteSpace(string current)
{
  string myNewString = "";
  string temp = "";
  int l=current.length();
  myNewString+=current[0];
  for(int i=1;i<l;i++){
      if(myNewString[myNewString.length()-1]==' ' && current[i]==' ')
          continue;
      else
          myNewString+=current[i];
  }
  return myNewString;
}

答案 2 :(得分:0)

更多C ++ ish解决方案:

#include <algorithm>
#include <cctype>
#include <string>
#include <utility>
#include <iostream>

std::string remove_excessive_ws(std::string str)
{
    bool seen_space = false;
    auto end{ std::remove_if(str.begin(), str.end(),
                             [&seen_space](unsigned ch) {
                                 bool is_space = std::isspace(ch);
                                 std::swap(seen_space, is_space);
                                 return seen_space && is_space;
                             }
              )
    };

    if (end != str.begin() && std::isspace(static_cast<unsigned>(end[-1])))
        --end;

    str.erase(end, str.end());
    return str;
}

int main()
{
    char const *foo{ "Hello              World!       " };
    std::cout << '\"' << remove_excessive_ws(foo) << "\"\n";
}

输出:

"Hello World!"