为什么我无法删除字符串的空格?

时间:2016-05-30 02:41:12

标签: c++ string

我想删除字符串中的空格,但是当我运行程序并输入“hello world”时,它并没有跟我说话。它坠毁了,表明:

enter image description here

#include <bits/stdc++.h>
using namespace std;

int main()
{
    string str;
    getline(cin,str);
    int space;
    while(str.find(' ')>=0) {//something wrong happened in the loop
        space = str.find(' ');
        str.erase(space,1);
    }
    cout<<str<<endl;
    return 0;
}

我非常困惑,因为我不知道为什么我的字符串超出范围。所以如何解决它?提前谢谢。

1 个答案:

答案 0 :(得分:4)

修改

所以真正的问题是它为什么会抛出错误。 当访问不在容器范围内的索引时,抛出std :: out_of_range异常。

如评论中所述,问题出在while(str.find(' ')>=0)string::find在找不到任何内容时返回string::nposstring::npos被定义为-1,但因为它是size_t类型,所以它不能小于0.所以相反,该值是最大可能的unsigned int,因为它“循环”它的类型。

因此它将是4294967295,或者系统上size_t类型的最大值以及编译标记。

回到问题while(str.find(' ')>=0),因为str.find的返回始终是一个正值,因此您永远不会停止循环并最终获得std::out_of_range异常,因为您尝试访问str[string::npos]这是不可能的。

“更好”的时候会是:while(str.find(' ') != string::npos)

初步回答:

使用std::remove算法还有另一种方法可以做到这一点。它为std :: erase提供了一个范围。

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

int main()
{
    std::string str = "this is a line";

    std::cout << "before: " << str << std::endl;

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

    std::cout << "after: " << str << std::endl;
}