2016-12-06 83 views
1

我想弄清楚如何从一个字符串中一次删除一个字符,这样我就可以获取所有版本的字符串,但一次只能丢失一个字符。这是我想要做的工作,但无济于事。如何从一个字符串中一次删除一个字符?

for(int i = 0 ; i < s.length() ; i++){ 
    tmp.erase(0, i); 
    std::cout << tmp << std::endl; 
    s.at(i)++; 
} 

它显然适用于第一个,但是然后删除其余的。 JON应该有JN JO

+0

@FirstStep它需要处理任何规模大小 – Gman

回答

0

最简单的方法就是让每一次的字符串的拷贝,并修改副本的预期输出:

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_typelength()size()都返回(size_tsize()自然属于一起)。

你的代码几乎没有错,只是它忽略了每次都创建字符串的副本,并且s.at(i)++不属于那里。

+1

对于*正确性*的字符串,该指数应该是'的std :: string :: size_type',这可能是可能不是'size_t'。另外,'tmp.erase(i)'将擦除指定索引中的所有字符,直到字符串结尾。要擦除一个字符,您需要使用'tmp.erase(i,1)'或'tmp.erase(tmp.begin()+ i)'代替。 –

+0

谢谢。纠正。 –

+0

@SamVarshavchik啊,这很有道理!谢谢。哈哈smh在s.at(i)++ ... – Gman

2

您不会将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; 
} 
相关问题