我目前正在学习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
?
最重要的是这是正确的方法吗?
答案 0 :(得分:22)
std::string::erase
返回一个迭代器,但您不必使用它。您的原始字符串已被修改。
string removeSpaces(string input)
{
input.erase(std::remove(input.begin(),input.end(),' '),input.end());
return input;
}
答案 1 :(得分:10)
std::remove_if和erase
会更容易( see it live ):
input.erase(remove_if(input.begin(), input.end(), isspace),input.end());
使用std::isspace的优势在于它可以捕获所有类型的空白区域。
答案 2 :(得分:4)
假设您的输入有双倍空格,例如“c ++ [] []是[] 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指出的那样,它效率不高。
答案 3 :(得分:3)
这也应该有效 - std::replace( input.begin(), input.end(), ' ', '');
您需要加入<algorithm>
答案 4 :(得分: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”。
答案 5 :(得分: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;
}
答案 6 :(得分: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;
}