Ответ 1
std::string::erase
возвращает итератор, но вам не нужно его использовать. Исходная строка изменена.
string removeSpaces(string input)
{
input.erase(std::remove(input.begin(),input.end(),' '),input.end());
return input;
}
В настоящее время я изучаю С++. Я пытаюсь закодировать метод, чтобы удалить пробелы из строки и вернуть строку без пробелов Это мой код:
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
?
Самое главное, это правильный подход?
std::string::erase
возвращает итератор, но вам не нужно его использовать. Исходная строка изменена.
string removeSpaces(string input)
{
input.erase(std::remove(input.begin(),input.end(),' '),input.end());
return input;
}
std:: remove_if вместе с erase
будет намного проще (посмотреть в прямом эфире):
input.erase(remove_if(input.begin(), input.end(), isspace),input.end());
использование std:: isspace имело то преимущество, что оно захватит все типы пробелов.
Предположим, что ваш ввод имеет двойное пространство, например "С++ [] [] 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);
}
Это решение имеет преимущество быть простым, но, как указывает Тони Д, он неэффективен.
это также должно работать - std::replace( input.begin(), input.end(), ' ', '');
Вам нужно включить <algorithm>
этот код должен работать
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" соответственно.
Я пытался что-то написать. Эта функция принимает строку и копирует в другую временную строку весь контент без дополнительных пробелов.
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;
}
#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;
}