【问题标题】:C++ remove whitespaceC++ 删除空格
【发布时间】:2012-01-13 18:15:51
【问题描述】:

我有这段代码可以删除 std::string 中的空格,并删除空格后的所有字符。所以如果我有“abc def”它只返回“abc”。如何让它从“abc def ghi”变为“abcdefghi”?

#include<iostream>
#include<algorithm>
#include<string>

int main(int argc, char* argv[]) {
    std::string input, output;
    std::getline(std::cin, input);

    for(int i = 0; i < input.length(); i++) {
        if(input[i] == ' ') {
            continue;
        } else {
            output += input[i];
        }
    }
    std::cout << output;
    std::cin.ignore();
}

【问题讨论】:

  • 请参考之前的问题stackoverflow.com/questions/83439/…
  • 那是使用STL算法或boost。我想“手动”做这个。用我写的方式(如果可能的话)。
  • 请注意,编辑修复了代码,因此问题中的问题不再像描述的那样重现。因此,这个问题不再是关于删除空白,所以我投票结束。

标签: c++ string stl std


【解决方案1】:

问题是cin &gt;&gt; input 只读取到第一个空格。请改用getline()。 (谢谢@BenjaminLindley!)

【讨论】:

  • 你的意思是 getline free 函数,因为它更好,而且input 无论如何都是std::string
  • 正如@BenjaminLindley 提到的,使用istream&amp; getline ( istream&amp; is, string&amp; str, char delim ); istream&amp; getline ( istream&amp; is, string&amp; str );
【解决方案2】:

由于&gt;&gt; 运算符无论如何都会跳过空格,因此您可以执行以下操作:

while (std::cin>>input)
    std::cout << input;

但是,这将复制整个文件(删除空格)而不是仅复制一行。

【讨论】:

    【解决方案3】:

    好吧,其他人提到了关于cin &gt;&gt; 的实际问题 但是您可以使用以下代码从字符串中删除空格:

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

    【讨论】:

    • 那是为了从字符串中删除空格。如果你想要一个没有空格的副本(如 OP 中的),你可以使用std::copy_if(input.begin(), input.end(), std::back_inserter(output), [](char ch) { return ch != ' '; });
    【解决方案4】:

    我删除字符的函数叫做“conv”:

    #include <cstdlib>
    #include <iostream>
    #include <string>
    
    using namespace std;
    
    string conv(string first, char chr)
    {
        string ret,s="x";
        for (int i=0;i<first.length();i++)
        {
            if (first[i]!=chr)
            s=s+first[i]; 
        }
        first=s;
        first.erase(0,1);
        ret=first;
        return ret;
        }
    int main()
    {
        string two,casper="testestestest";
        const char x='t';
        cout<<conv(casper,x);
        system("PAUSE");
        return 0;
    }
    

    您需要将const char x 更改为' '(空白,blanco)才能完成工作。希望这会有所帮助。

    【讨论】:

    • 请在您的代码中使用英文...这就是为什么 C++ 关键字是英文的,以便全球理解...
    • @user2007447 是真正的独生子女
    【解决方案5】:
    ifstream ifs(filename);
    string str, output;
    vector<string> map;
    while (getline(ifs, str, ' ')) {
        map.push_back(str);
    }
    for(int i=0; i < map.size();i++){
        string dataString = map[i];
        for(int j=0; j < dataString.length(); j++){
            if(isspace(dataString[j])){
                continue;
            }
            else{
                output +=dataString[j];
            }
        }
    }
    

    【讨论】: