从字符串中删除空格

时间:2013-04-21 17:29:37

标签: c++ string spaces

我尝试编写一个函数来获取带空格的字符串,并返回不带空格的字符串。

例如:

str = "   a  f  ";

将被替换为“af”;

我的功能不起作用,它将字符串替换为:“af f”。

这是我的功能:

void remove_space(string& str) {
    int len = str.length();
    int j = 0, i = 0;
    while (i < len) {
        while (str.at(i) == ' ') i++;
        str.at(j) = str.at(i);
        i++;
        j++;
    }
}

int main ()
{
string str;
    getline(cin, str);
    remove_space(str);
    cout << str << endl;
return 0;
}

任何帮助表示赞赏!

5 个答案:

答案 0 :(得分:3)

Bounds check!

您忘记检查内循环访问的边界:while (str.at(i) == ' ') i++;

我重写了代码:

void remove_space(string& str)
{
    int len = str.length();
    int j = 0;

    for (int i = 0; i < len;)
    {
        if (str.at(i) == ' ')
        {
            i++;
            continue;
        }

        str.at(j++) = str.at(i++);
    }
    str.resize(j);
}

此外,您可以使用以下代码删除空格(cppreference.com中建议):

str.erase(std::remove(str.begin(), str.end(), ' '), str.end());

答案 1 :(得分:2)

如果您可以使用Boost,则可以执行以下操作:

#include<boost/algorithm/string.hpp>
...
erase_all(str, " ");

否则,我会建议这个替代方案:

#include<cctype>
#include<algorithm>
...
str.erase(std::remove (str.begin(), str.end(), ' '), str.end());

答案 2 :(得分:1)

#include<cctype>
#include<algorithm>

bool my_isspace(char c) {
    return std::isspace(c);
}

str.erase(remove_if(str.begin(), str.end(), my_isspace), str.end());

应该做的。


关于你的功能

void remove_spaces(string& str)
{
    int len = str.length();
    int j = 0, i = 0;

    while (j < len) 
    {
        if (str.at(i) == ' ') {
          ++j;
        }
        str.at(i) = str.at(j);
        ++i;
        ++j;
    }


    // You are missing this
    str.erase(i,len);
}

答案 3 :(得分:1)

您可以使用久经考验的erase remove idiom

,而不是实施自己的解决方案
#include <string>
#include <algorithm>
#include <iostream>

int main()
{
  std::string s("a b c d e f g");
  std::cout << s << "\n";
  const char_to_remove = ' ';
  s.erase(std::remove(s.begin(), s.end(), char_to_remove), s.end() );
  std::cout << s << "\n";
}

答案 4 :(得分:1)

您需要在处理后调整字符串大小。例如。在remove_space末尾添加行:

str.resize(j);