2016-01-04 82 views
0

這裏字符(az,AZ)是我的代碼:刪除所有來自C++字符串

#include <iostream> 

using namespace std; 

string moveString(string t, int index) 
{ 
    for (int i=index; t[i]!=NULL;i++) 
    { 
     t[i]=t[i+1]; 
    } 
    return t; 
} 

string delChars(string t) 
{ 
    for (int i=0; t[i]!=NULL; i++) 
    { 
     if (t[i]>'a' && t[i]<'z') 
     { 
      moveString(t, i); 
     } 
     else if (t[i]>'A' && t[i]<'Z') 
     { 
      moveString(t, i); 
     } 
    } 
    return t; 
} 

int main() 
{ 
    int numberOfSpaces; 
    string t; 
    cout << "Text some word: "; cin>>t; 
    cout<<delChars(t); 
    return 0; 
} 

第一功能moveString應該(理論上)採取了從一個字符串的每一個字符由1個指數下跌(開始從給定的索引) - 刪除1個字符。其餘的很明顯。但是:

輸入:abc123def 輸出:abc123def

我在做什麼錯?

還有一個小問題:實際上,從數組中刪除元素的最佳方法是什麼? (陣列的int S,char S等)

+2

... ['std :: remove_copy_if()'](http://en.cppreference.com/w/cpp/algorithm/remove_copy)? – genpfault

回答

2

moveString需要t按價值計算,你並沒有使用它的返回值,所以它不會改變delCharst。所以,確保你學到的下一個東西是參考。

除此之外,我不知道該說什麼t[i] != NULL(如果它是未定義的行爲或不),但我們有std::string::size以獲得std::string的長度,例如, i < t.size()。如果你有t[i + 1],那麼條件應該是i + 1 < t.size()。不管怎樣,不要像char陣列一樣使用它,留下以前大小的字符串。您可以在移動字符後最後(重複)字符pop_back

值得一提的是,它可以在地道的C++算法一行來完成,但你希望得到您的代碼工作...

2

邏輯的東西是正確的,但他的回答是不夠的。 move後不應增加i。由於i.th character被刪除,並且i現在指向下一個字符。

string delChars(string t) 
{ 
    for (int i=0; t[i]!=NULL;) 
    { 
     if (t[i]>'a' && t[i]<'z') 
     { 
      t = moveString(t, i); 
     } 
     else if (t[i]>'A' && t[i]<'Z') 
     { 
      t = moveString(t, i); 
     } 
     else 
      i++; 
    } 
    return t; 
} 
1

我在做什麼錯?

不使用標準算法

其實,是一種「刪除」從數組中的元素的最佳方法是什麼? (整數,字符等等)

使用標準刪除擦除成語:

#include <iostream> 
#include <string> 
#include <algorithm> 
#include <iomanip> 
#include <cstring> 

int main() 
{ 
    using namespace std; 

    auto s = "!the 54 quick brown foxes jump over the 21 dogs."s; 
    cout << "before: " << quoted(s) << endl; 

    s.erase(std::remove_if(s.begin(), 
          s.end(), 
          [](auto c) { return std::isalpha(c); }), 
           s.end()); 

    cout << "after: " << quoted(s) << endl; 
    return 0; 
} 

預期輸出:

before: "!the 54 quick brown foxes jump over the 21 dogs." 
after: "! 54  21 ." 

我不允許使用標準算法

然後保持簡單:

#include <iostream> 
#include <string> 
#include <algorithm> 
#include <iomanip> 
#include <cstring> 


std::string remove_letters(const std::string& input) 
{ 
    std::string result; 
    result.reserve(input.size()); 

    for (auto c : input) { 
     if (!std::isalpha(c)) { 
      result.push_back(c); 
     } 
    } 

    return result; 
} 

int main() 
{ 
    using namespace std; 

    auto s = "!the 54 quick brown foxes jump over the 21 dogs."s; 
    cout << "before: " << quoted(s) << endl; 

    auto s2 = remove_letters(s); 

    cout << "after: " << quoted(s2) << endl; 
    return 0; 
} 
+0

這是一個家庭作業,而不是新的品牌項目。我不允許使用這些方法 – Frynio

+0

@Frynio在響應中更新 –