Подтвердить что ты не робот

Удалить пробелы из строки в С++

В настоящее время я изучаю С++. Я пытаюсь закодировать метод, чтобы удалить пробелы из строки и вернуть строку без пробелов Это мой код:

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? Самое главное, это правильный подход?

4b9b3361

Ответ 1

std::string::erase возвращает итератор, но вам не нужно его использовать. Исходная строка изменена.

string removeSpaces(string input)
{
  input.erase(std::remove(input.begin(),input.end(),' '),input.end());
  return input;
}

Ответ 3

Предположим, что ваш ввод имеет двойное пространство, например "С++ [] [] is [] fun" ([ ] представляет одно пространство). Первое пространство имеет индекс 3 (нумерация начинается с 0), а второе пространство - это, конечно, индекс 4.

В вашем цикле for, когда вы нажмете i == 3, вы удалите первое пространство. Следующая итерация цикла принимает i == 4 как индекс. Но есть ли второе место в индексе 4? Нет! Удаление первого пространства изменило строку на "С++ [] is [] fun": пространство для удаления находится в индексе 3, снова!

Решением может быть удаление пробелов справа налево:

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

Это решение имеет преимущество быть простым, но, как указывает Тони Д, он неэффективен.

Ответ 4

это также должно работать - std::replace( input.begin(), input.end(), ' ', ''); Вам нужно включить <algorithm>

Ответ 5

этот код должен работать

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" соответственно.

Ответ 6

Я пытался что-то написать. Эта функция принимает строку и копирует в другую временную строку весь контент без дополнительных пробелов.

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;

}

Ответ 7

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