我想从字符串中删除一些单词但我的代码不起作用。我没有任何错误或警告,但我认为我的字符串变空了。有人可以帮我吗?我试图将我的初始字符串转换为2个向量,以便我可以更轻松地导航
#include <iostream>
#include <sstream>
#include <string>
#include <vector>
using namespace std;
int main()
{
string s("Somewhere down the road");
string t("down");
istringstream iss(s);
vector <string> plm;
vector <string> plm2;
do
{
string sub;
iss >> sub;
plm.push_back(sub);
} while (iss);
for(unsigned int i=0 ; i<plm.size();i++){
cout<<plm[i];}
istringstream ist(t);
do
{
string subb;
ist >> subb;
plm2.push_back(subb);
} while (ist);
for(int i=0;i<plm.size();i++){
for(int j=0;j<plm2.size();i++){
{if (plm[i]==plm2[j])
plm.erase(plm.begin()+j);}}}
for(int i=0 ; i<plm.size();i++)
cout<<plm[i];
}
答案 0 :(得分:3)
警告:这实际上只是一个评论太长而无法放入评论字段。哦,还有点咆哮。
我很高兴我们拥有这些现代语言,让生活变得比几十年前容易得多。例如,考虑一下这项工作看起来像是一种长期以来垂死的SNOBOL 4编程语言:
<script type="text/javascript">
document.getElementById("click").onclick = function(){
var hoursOne = parseFloat(document.getElementById("one").value);
alert(hoursOne);
}
</script>
上帝,很高兴我们已经取得了如此大的进步,以至于我们不需要处理3行代码,我们现在可以只用52行来代替(哦,除了52行)线条实际上不起作用,但暂时忽略它。)
我想,公平地说,我们可以在C ++中更紧凑地完成工作。一个显而易见的方法是使用 s = 'somewhere down the road'
del s 'down' = :s(del)
OUTPUT = s
,一些流迭代器和一个或两个字符串流:
std::remove_copy
答案 1 :(得分:1)
转换为向量没有任何好处 - 字符串本身已经提供了您想要做的所有必要的事情。无论如何,这样做:
vector<char> v;
v.assign(s.c_str(), s.c_str() + s.length()); // without...
v.assign(s.c_str(), s.c_str() + s.length() + ); // including...
// ... terminating null character
现在变得容易了:
size_t pos = s.find(t);
if(pos != string::npos)
{
s.erase(pos, t.length());
}
但是,这并不关心是否留下多个空格或者如果t不是s中的整个单词(例如t = "down"; s = "I'm going to downtown.";
会导致s == "I'm going to town."
),但你也没有这样做。
答案 2 :(得分:0)
第一个问题是,如果仅在起始位置调用std::string::erase
,它会删除所有内容直到字符串结束。
第二个问题是,代码将只删除第二个字符串中的所有字母,一个接一个。即不是整个单词 - 为此,你需要检查整个单词是否匹配,然后才擦除(单词的整个长度)。问问自己 - 代码中会发生什么,例如前两个字母会匹配,但不是其他字母?
答案 3 :(得分:0)
在您的第二个for
循环中,您永远不会增加j
并在if (plm[i]==plm2[j])
块内使用j
而不是i
作为{{1 }}
erase()
另一件事是不使用for(int i=0;i<plm.size();i++)
{
for(int j=0;j<plm2.size();j++)//here you need to increment j
{
if (plm[i]==plm2[j])
plm.erase(plm.begin()+i);//here the offset should be i
}
}
循环从do...while
读取并推回向量。如果读取失败,您将无效数据推送到向量,而是尝试类似:
stringstream
答案 4 :(得分:-1)
你没有增加j这是我在代码中看到的第一件事。如果它仍然无法正常写,那么请问!