我想删除字符串中的空格,但是当我运行程序并输入“hello world”时,它并没有跟我说话。它坠毁了,表明:
#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;
}
我非常困惑,因为我不知道为什么我的字符串超出范围。所以如何解决它?提前谢谢。
答案 0 :(得分:4)
修改强>
所以真正的问题是它为什么会抛出错误。 当访问不在容器范围内的索引时,抛出std :: out_of_range异常。
如评论中所述,问题出在while(str.find(' ')>=0)
。 string::find
在找不到任何内容时返回string::npos
。
string::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;
}