17

我目前正在学习 C++。我正在尝试编写一种方法来删除字符串中的空格并返回没有空格的字符串这是我的代码:

string removeSpaces(string input)
{
  int length = input.length();
  for (int i = 0; i < length; i++) {
     if(input[i] == ' ')
        input.erase(i, 1);
  }
  return input
}

但这有一个错误,因为它不会删除两个或三个空格。我在网上找到了这个

s.erase(remove(s.begin(),s.end(),' '),s.end());

但显然这正在返回一个iterator(如果我理解得很好)有没有办法将其转换iterator回我的字符串input?最重要的是这是正确的方法吗?

4

7 回答 7

25

std::string::erase返回一个迭代器,但您不必使用它。您的原始字符串已被修改。

string removeSpaces(string input)
{
  input.erase(std::remove(input.begin(),input.end(),' '),input.end());
  return input;
}
于 2013-05-02T02:23:40.153 回答
10

std::remove_iferase容易得多(现场观看):

input.erase(remove_if(input.begin(), input.end(), isspace),input.end());

使用std::isspace的优点是可以捕获所有类型的空白。

于 2013-05-02T02:24:34.953 回答
4

假设您的输入有一个双空格,例如“c++[ ][ ]is[ ]fun”([ ]代表一个空格)。第一个空格的索引为 3(编号从 0 开始),第二个空格当然是索引 4。

在您的for循环中,当您点击时,您i == 3会擦除第一个空格。循环的下一次迭代将i == 4作为索引。但是现在是索引 4 处的第二个空格吗?不!删除第一个空格将字符串更改为 "c++[ ]is[ ]fun":要删除的空间再次位于索引 3 处!

解决方案可以是从右到左删除空格:

for (int i = length-1; i >= 0; --i) {
   if(input[i] == ' ')
      input.erase(i, 1);
}

该解决方案的优点是简单,但正如 Tony D 指出的那样,它效率不高。

于 2013-05-02T02:25:35.877 回答
3

这也应该有效—— std::replace( input.begin(), input.end(), ' ', '');你需要包括<algorithm>

于 2013-05-02T02:44:14.670 回答
0

这段代码应该可以工作

string removeSpaces(string input)
{
  int length = input.length();
  for (int i = 0; i < length; i++) {
     if(input[i] == ' ')
     {
        input.erase(i, 1);
         length--;
         i--;
     }
  }
  return input
}

原因:如果它在字符串中获得空间,它将减少字符串的长度,因此您必须相应地更改变量:“length”。

于 2015-10-11T21:22:12.887 回答
0
#include<iostream>
#include<string.h>
using namespace std;

void trimSpace(char s[])
{
    int i=0, count=0, j=0;

    while(s[i])
    {
        if(s[i]!=' ')
            s[count++]=s[i++];
        else {
            s[count++]=' ';

            while(s[i]==' ')
                i++;
        }       
    }   

    s[count]='\0';
    cout<<endl<<"  Trimmed String : ";  
    puts(s);
}

int main()
{
    char string[1000];
    cout<<"  Enter String : ";
    gets(string);
    trimSpace(string);

    return 0;
}
于 2017-08-21T21:38:06.940 回答
0

我试着写点东西。此函数获取一个字符串并将所有内容复制到另一个临时字符串,而无需额外的空格。

std::string trim(std::string &str){
int i = 0;
int j = 0;
int size = str.length();
std::string newStr;
bool spaceFlag = false;

for(int i = 0;i < size; i++){
    if(str[i] == ' ' && (i+1) < size && str[i+1] == ' '){
        i++;
        spaceFlag = true;
        continue;
    }       
    if(str[i] == ' '){
        newStr += " ";
        continue;
    }
    if(str[i] == '\t' && i != 0){
        str[i] = ' ';
        newStr += " ";
    }
    else{
        newStr += str[i];
        if(spaceFlag){
            newStr += " ";
            spaceFlag = false;
        }
    }
}
str = newStr;

return str;

}

于 2017-08-20T16:24:13.227 回答