我想弄清楚如何从一个字符串中一次删除一个字符,这样我就可以获取所有版本的字符串,但一次只能丢失一个字符。这是我想要做的工作,但无济于事。如何从一个字符串中一次删除一个字符?
for(int i = 0 ; i < s.length() ; i++){
tmp.erase(0, i);
std::cout << tmp << std::endl;
s.at(i)++;
}
它显然适用于第一个,但是然后删除其余的。 JON应该有JN JO
我想弄清楚如何从一个字符串中一次删除一个字符,这样我就可以获取所有版本的字符串,但一次只能丢失一个字符。这是我想要做的工作,但无济于事。如何从一个字符串中一次删除一个字符?
for(int i = 0 ; i < s.length() ; i++){
tmp.erase(0, i);
std::cout << tmp << std::endl;
s.at(i)++;
}
它显然适用于第一个,但是然后删除其余的。 JON应该有JN JO
最简单的方法就是让每一次的字符串的拷贝,并修改副本的预期输出:
for(std::string::size_type i = 0 ; i < s.size() ; i++){
auto tmp=copy;
tmp.erase(i, 1);
std::cout << tmp << std::endl;
}
为了确保正确无误,该指数变量应该是一个std::string::size_type
,length()
和size()
都返回(size_t
和size()
自然属于一起)。
你的代码几乎没有错,只是它忽略了每次都创建字符串的副本,并且s.at(i)++
不属于那里。
对于*正确性*的字符串,该指数应该是'的std :: string :: size_type',这可能是可能不是'size_t'。另外,'tmp.erase(i)'将擦除指定索引中的所有字符,直到字符串结尾。要擦除一个字符,您需要使用'tmp.erase(i,1)'或'tmp.erase(tmp.begin()+ i)'代替。 –
谢谢。纠正。 –
@SamVarshavchik啊,这很有道理!谢谢。哈哈smh在s.at(i)++ ... – Gman
您不会将tmp
重置为每个循环迭代中的原始字符串值,因此它会持续从tmp
删除越来越多的字符,直到它为空。
您还在每次循环迭代中删除错误的字符范围。
您还在修改每个循环迭代中的原始字符串以递增其单个字符的值。你为什么这么做?
尝试一些更喜欢这个:
for(std::string::size_type i = 0 ; i < s.length() ; i++){
std::string tmp = s;
tmp.erase(i, 1);
std::cout << tmp << std::endl;
}
@FirstStep它需要处理任何规模大小 – Gman