我想从字符串中删除一些单词,但我的代码无法工作。我没有任何错误或警告,但我认为我的字符串变成了空的。有人能帮我一下吗?我试着将我的初始字符串转换成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];
}发布于 2016-05-09 06:21:56
警告:这真的只是一个太长的注释,无法放入注释字段中。哦,还有点大惊小怪的。
我很高兴我们有了这些现代语言,让生活变得比几十年前容易得多。例如,考虑一下这个工作看起来是什么样子的SNOBOL 4编程语言:
s = 'somewhere down the road'
del s 'down' = :s(del)
OUTPUT = s天哪,我们已经取得了如此大的进步,以至于我们不必处理整整3行代码,现在我们只需52行代码就可以完成这项工作,这真是太好了(哦,除了这52行代码实际上并不起作用,但我们暂时忽略这一点)。
我想,公平地说,我们可以在C++中更简洁地完成这项工作。一种明显的方式是使用std::remove_copy、一些流迭代器和一两个字符串流:
std::istringstream input("somewhere down the road");
std::string del_str("down");
std::istream_iterator<std::string> in(input), end;
std::ostringstream result;
std::remove_copy(in, end, std::ostream_iterator<std::string>(result, " "), del_str);
std::cout << result.str();发布于 2016-05-09 06:06:33
转换成向量没有任何好处--字符串本身已经提供了你想要做的所有事情。不管怎样,这样做:
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."),但是您也没有这样做……
发布于 2016-05-09 06:03:38
第一个问题是,如果只使用起始位置调用std::string::erase,它将擦除字符串末尾之前的所有内容。
第二个问题是,代码只会逐个删除第二个字符串中的所有字母。例如,不是整个单词-为此,您需要检查整个单词是否匹配,然后才会擦除(单词的整个长度)。问问你自己--如果前两个字母匹配,而单词的其余部分不匹配,那么代码中会发生什么?
https://stackoverflow.com/questions/37105202
复制相似问题