2016-04-29 11 views
0

私のコードにはちょっとしたエラーがあるようです。C++ STLリンクリスト

私の主な問題は、私が「H」に続く「P」のいずれかの発生を変更したい部分です。私のテストでは、それを何らかの理由で 'q'に変更します。これを 'f'に変更したいときに使用します。

の便宜のために問題と方法は、ループの第二の空隙の変化()、です。

誰かが助けてくれますか?

#include <iostream> 
#include <list> 
#include <ctype.h> 
#include <fstream> 

using namespace std; 

void printList(const list<char> &myList); 
void fillList(list<char> &myList); 
void change(list <char> &myList); 

void printList(const list<char> &myList) 
{ 
    list<char>::const_iterator itr; 
    for (itr = myList.begin(); itr != myList.end(); itr++) { 
     cout <<*itr; 
    } 
    cout << '\n' << endl; 
} 

void fillList(list<char> &myList) 
{ 
    ifstream file("test.txt"); 
    string print; 
    while(file >> print){ 
     for (int i = 0; i<print.length(); i++) { 
      myList.push_back(print[i]); 
     } 
     myList.push_back(' '); 
    } 
} 

void change(list <char> &myList) 
{ 
    list<char>::iterator itr; 

    //rules are as follows 

    for (itr = myList.begin(); itr != myList.end(); itr++) { 
     if (*itr == 'w'){ 
      *itr = 'v'; 
     } 
    } 

    for (itr = myList.begin(); itr != myList.end(); itr++) { 
     if((*itr == 'p' && ++*itr == 'h')){// rule incomplete ask! 
      *itr = 'f'; 
     } 
    } 


} 

int main() 
{ 
    list<char> myList; 
    ifstream file("test.txt"); 
    const string print; 

    fillList(myList); 
    printList(myList); 

    change(myList); 
    printList(myList); 

    return 0; 
} 
+1

[あなたは] 'H' に続く 'P' のいずれかの発生を変更したいだけ*セクション* – user2079303

+0

申し訳ありませんが含まれている[MCVE]作成し、I私の説明がちょっとばかげていることに気づいたので、私はそれが私がしたいことをよりよく反映するように更新しました。 – TheByteMonster

+0

私は '++ * itr'があなたが思っていることをしていないと賭けています。そして、あなたのファイルが 'p'で終わらないことを願っていました。 – WhozCraig

答えて

1

コードif((*itr == 'p' && ++*itr == 'h'))はありません、以下:

  1. itrの値はp
  2. itrで値を取り、それをインクリメントしている場合
    • p + 1 = q
  3. ランダムイテレータ問題を修正しましおよびコメントで指摘したように pが最後の文字であるかどうかを確認:あなたは何をする必要があるか0

は値、イテレータを増やしていない

if(*itr == 'p') { 
    if(itr == myList.end()) break; // return or do something else 
    std::list<char>::iterator itr2 = itr; 
    if(*(++itr2) == 'h') { 
     // do what you need to 
    } 
} 

編集です。

+1

'' p ''が最後の文字であれば? (私はちょうど1つの要素を早く停止するためにループの終了条件を変更します)。あなたは...クラッシュだからの世話をすると、おそらく私はあなたがこれでどこから来ているiを1 ITRを増やす必要があり得るが、今私のコードは何もしません、それはdoesnの – BoBTFish

+0

'ph'を変更することさえありません。この問題を考える上でのさらなる方法はありますか? –

+0

異なる段階にあれば壊すことにより、より多くのロジックを追加 – TheByteMonster

1

あなたはポインタの文字ではなくイテレータをインクリメントしたからです。 ++*itrの代わりに*++itrを実行して修正できます。

私はあなたのコードを変更しました。あなたは簡単に新しいルールを作成できます。

//we copy the string because we want to modify it without modifying the original 
// http://stackoverflow.com/a/14679003/4376737 
std::string find_and_replace(string str, const string& find, const string& replace) 
{ 
    size_t pos = 0; 
    while ((pos = str.find(find, pos)) != string::npos) { 
    str.replace(pos, find.length(), replace); 
    pos += replace.length(); 
    } 

    return std::move(str); 
} 
void change(list <char> &myList) 
{ 
    list<char> newlist; 

    std::stringstream ss; 
    for (auto&& it = myList.begin(); it != myList.end(); ++it) { 
    if (*it != ' ') { 
     ss << *it; 
    } else { 
     auto&& newstr = find_and_replace(ss.str(), "ph", "f"); 
     newstr = find_and_replace(newstr, "w", "v"); 
     for (auto&& ch : newstr) { 
     newlist.push_back(ch); 
     } 
     newlist.push_back(' '); 
     std::stringstream().swap(ss); //this clears the stringstream 
    } 
    } 

    myList = newlist; 
} 

出力:

hamper moshpit phile wwwphwwwf 

hamper moshpit file vvvfvvvf