【问题标题】:Removing all but one whitespace between words in C++删除 C++ 中单词之间的所有空格,但只有一个空格
【发布时间】:2019-02-26 07:04:24
【问题描述】:

我需要删除单词之间除了一个空格之外的所有空格。我遍历字符串和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;
}

【问题讨论】:

  • 首先,请learn how to debug your programs,你通常是这样解决这类问题的。
  • 对于替代解决方案,您可以使用字符串流和流迭代器来获取附加到新字符串的“单词”,其间只有一个空格。
  • 可能有帮助的技巧是找到第一个空白的索引位置并保持它的温度,然后删除该和下一个非空白字符之间的所有空白。删除空格后,使用该临时索引值在该位置添加一个空格。这可能不是最有效的方法,但它可以解决您的问题。此外,如果有多个空白部分,您可以更新下一组的临时索引位置。

标签: c++


【解决方案1】:

问题出在条件

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;
}

【讨论】:

  • @ponikoli:还有其他一些错误,请参阅更新后的答案
【解决方案2】:

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

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;
}

【讨论】:

    【解决方案3】:

    一个更 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!"
    

    【讨论】: