2016-12-06 60 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; 
} 
相關問題