在C++; 我目前正在学习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 }

在C++; 我目前正在学习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 },c++,string,C++,String,但很明显,这返回了一个迭代器(如果我理解清楚的话) 有没有办法将迭代器转换回我的字符串输入? 最重要的是这是正确的方法?std::string::erase返回迭代器,但您不必使用它。您的原始字符串已修改 string removeSpaces(string input) { input.erase(std::remove(input.begin(),input.end(),' '),input.end()); return input; } 与一起擦除会容易得多(): 使用had的优

但很明显,这返回了一个
迭代器
(如果我理解清楚的话) 有没有办法将
迭代器
转换回我的字符串
输入

最重要的是这是正确的方法?

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

string removeSpaces(string input)
{
  input.erase(std::remove(input.begin(),input.end(),' '),input.end());
  return input;
}
一起擦除
会容易得多():


使用had的优点是它将捕获所有类型的空白。

让我们假设您的输入有一个双空格,例如“c++[]很有趣”(
[]
表示一个空格)。第一个空间有索引3(从0开始计算),第二个空间当然是索引4

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

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

for (int i = length-1; i >= 0; --i) {
   if(input[i] == ' ')
      input.erase(i, 1);
}
这个解决方案的优点是简单,但正如Tony D所指出的,它效率不高。

这也应该有效--
std::replace(input.begin(),input.end(),'')您需要包括

此代码应该有效

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
}
字符串移除空间(字符串输入)
{
int length=input.length();
for(int i=0;i

原因:如果它在字符串中获得空间,它将减少字符串的长度,因此您必须相应地更改变量:“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;
std::string修剪(std::string&str){
int i=0;
int j=0;
int size=str.length();
std::字符串newStr;
bool spaceFlag=false;
对于(int i=0;i
}
#包括
#包括
使用名称空间std;
无效空间(字符s[])
{
int i=0,count=0,j=0;
而(s[i])
{
如果(s[i]!=“”)
s[count++]=s[i++];
否则{
s[count++]='';
而(s[i]=='')
i++;
}       
}   
s[计数]='\0';


我很确定这会对字符串
s
进行就地修改。因此它返回一个迭代器并不重要。只需更改
s
并返回
s
。只是一个值得一提的选项……与说
std::vector
不同,
std::string
有一个默认值(对于第二个参数,
std::string::npos
充当“直到结束”的哨兵,因此您可以简单地
s.erase(remove(s.begin(),s.end(),“”));
@TonyD我认为您的版本号更简单/因此表达式
s.erase(remove(s.begin(),s.end(),“”),s.end())
只是一个哨兵,它告诉我字符串何时完成,对吗?@lucaConfa:是的,没错-它告诉
擦除
将元素一直删除到
字符串的末尾,这是
std::string::erase
的默认行为……但我读到,移除不会删除str中的空格ing是这样吗?@mikey我还添加了一个实例,这样你就可以看到它在运行。我的编译器抛出了一个
错误:调用'remove\u if'
。remove'没有匹配的函数,使用namespace std;`并限定所有内容。你必须引入另一个isspace。这很有意义!非常感谢,它解决了我的问题!感觉有点不舒服umb.谢谢!对于包含大量空白的大字符串来说,这是非常低效的(例如,如果您有几兆字节的CSV格式的数字需要压缩),因为每次擦除都必须将所有字符移到该点之外。更为小心的是,您可以使用两个指针进行一次向前传递,一个指针跟踪压缩的字符串位置,另一个指针跟踪下一个未压缩的字符,然后只需擦除尾随字符。擦除/删除习惯用法Vaughn文档可以做到这一点。@TonyD我想我理解明白你的意思。我将在我的代码中使用erase/remove idoim,即使我必须处理的字符串的大小和数量非常小。我必须在指针上做更多的工作!明白了!输入
input.erase()
更改我的字符串,然后我可以使用修改后的字符串。有一件事,希望您能帮助我,现在我出现以下错误:无法将参数“1”的“\uu gnu\u cxx::\uu normal\u iterator”转换为“const char*”,以“int remove”(const char*)@lucaConfa:用
std::remove
试试。好的,很抱歉,@bill说我需要包含
。再次感谢您的帮助。No.
是一个空字符常量。现在您要用空字符替换空格?哪一个更好?删除还是替换?谢谢包含,我错过了。我猜removing可能是比用null替换更好的选择…因为您不能用
'
(空字符常量)替换。用NUL替换通常是没有用的行为…当您稍后写出字符串,或尝试执行查找、迭代、大小等操作时-仍将考虑所有NUL-
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
}
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;
}