3

私は今日あなたのために非常に単純なものを持っています、しかしそれは確かに私を何時間も困惑させました。文字列イテレータの字幕に問題があると思います。私はオンラインで調べて、コードをCSEの教授に渡しましたが、感謝祭の休憩だったので、彼は電話しか持っておらず、あまり役に立ちませんでした。

うまくいけば、誰かがこれを見て、すぐに問題を見つけることができます。注意として、私の目標は単に文字列から特殊文字を削除することです。この文字列は参照によって関数に渡されます(したがって、戻り型は必要ありません)。追記として、私はこれを可能な限り効率的に保つように努めています。私の当初の考えは、これをネストされたforループに単純にシフトすることでしたが、CSEの教授は、一部の特殊なケースでは、文字列イテレータを含むforループの方が効率的であると主張しています。誰か助けてくれたら教えてください!!

removeは単なるchar*ではなく、const char *を受け取るため、問題はremove関数にある必要があるように思われます。text.begin()はconstではないため、問題が発生すると思います。しかし、関数const string&textのパラメーターを作成すると、参照によってテキストを変更できないことは明らかです。

これが私がこれまでに持っているコードです:

主に私たちが持っている:

 string temp = "~cool~";
 XML * parser = new XML();
 parser->clearSpecialChars(temp);
 cout << temp;

関数は次のとおりです。

void XML::clearSpecialChars(string &text)
{
    char chars[]= ".,!()1234567890[]'<>:/{}_|=+;-`~";
        for (unsigned int i = 0; i < 33; ++i)
        {
            text.erase(std::remove(text.begin(),text.end(),chars[i]),text.end());
        }
 }

ただし、次のコンパイラエラーが発生します。

 XML.cpp: In member function ‘void XML::clearSpecialChars(std::string&)’:
 XML.cpp:86:69: error: cannot convert ‘std::basic_string<char>::iterator {aka __gnu_cxx::__normal_iterator<char*, std::basic_string<char> >}’
 to ‘const char*’ for argument ‘1’ to ‘int remove(const char*)’

どんな考えでも大歓迎です!

4

2 に答える 2

3

と呼ばれる2つの関数がありますremove。それぞれの説明は次のとおりです。

http://www.cplusplus.com/reference/algorithm/remove/

http://www.cplusplus.com/reference/clibrary/cstdio/remove/

于 2012-11-24T02:57:54.680 に答える
1

ハードコードされた「33」は私をうんざりさせます。本当に'\x00'を特殊文字のセットに含めたいですか?

最新のC++は、可能であればループをライブラリルーチンにオフロードします。これは別の実装です。

void XML::clearSpecialChars(string &text)
{
    const string chars = ".,!()1234567890[]'<>:/{}_|=+;-`~\x00";

    auto new_end = std::remove_if(text.begin(), text.end(), 
        [chars](string::value_type c)
            { return chars.find(c) != string::npos; });
    text.erase(new_end, text.end());
}
于 2012-11-24T04:40:54.200 に答える