0

Url のエンコードまたはデコードを行う Url Encoder クラスを作成しました。

特殊文字を保存するために、私は map を使用しましたstd::map<std::string, std::string> reserved

そして、私はこのようにマップを初期化しましたthis->reserved["!"] = ":)";

特定の文字列から文字を読み取るために、イテレータを使用していますfor(string::iterator it=input.begin(); it!=input.end(); ++it)

置換機能を使用して特殊文字を置換しようとするとencodeUrl.replace(position, 1, this->reserved[*it]);

次のエラーが表示されます

Url.cpp: メンバー関数 'std::string Url::Url::UrlEncode(std::string)':
Url.cpp:69:54: エラー: 'char' から 'const char*' への無効な変換 [ -fpermissive]
/usr/include/c++/4.6/bits/basic_string.tcc:214:5: エラー: 'std::basic_string<_CharT, _Traits, _Alloc>::basic_string(const _CharT*, const _Alloc& の引数 1 を初期化中です。 ) [ with _CharT = char, _Traits = std::char_traits, _Alloc = std::allocator]' [-fpermissive]

コードの何が問題なのかわかりません。これが私の機能です

string Url::UrlEncode(string input){

    short position = 0;
    string encodeUrl = input;

    for(string::iterator it=input.begin(); it!=input.end(); ++it){

        unsigned found = this->reservedChars.find(*it);

        if(found != string::npos){

            encodeUrl.replace(position, 1, this->reserved[*it]);
        }

        position++;

    }

    return encodeUrl;
}
4

3 に答える 3

1

it文字の反復子です (型は ですstd::string::iterator)。したがって、*it文字です。

を実行しており、 ( ) に指定reserved[*it]した型のために、添字演算子はではなく を期待しています。reservedstd::map<std::string, std::string>stringchar

次に、コンパイラは からcharへのユーザー定義の変換を試みますが、を受け入れるstd::stringコンストラクタはありません。ただし、 a を受け入れるものがあります (こちらを参照) が、コンパイラは aを a に変換できません。したがって、エラー。stringcharchar const*charchar const*

unsignedまた、によって返される値ではstring::find()なく、 を使用する必要があることに注意してくださいstring::size_type

于 2013-02-18T13:36:48.853 に答える
1

std::stringさて、あなたのソリューションのエラーは、 c スタイルの 0 で終わる文字列 ( )ではなく、単一の文字const char *をマップに渡そうとしていることです。

std::string::iteratorは一度に 1 文字ずつ反復しているため、 を使用することをお勧めしますstd::map< char, std::string >

于 2013-02-18T13:36:53.520 に答える
0

*it の型と what の間に不一致があるようです

 reservedChars.find() 

受け入れることになっています。

追加してみる

const char* pit = *it;

直前

unsigned found = this->reservedChars.find(*pit);

    if(found != string::npos){

        encodeUrl.replace(position, 1, this->reserved[*pit]);
于 2013-02-18T14:49:41.293 に答える