0

我创建了一个 Url Encoder 类,其工作是对 Url 进行编码或解码。

为了存储特殊字符,我使用了 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是字符的迭代器(它有 type std::string::iterator)。因此,*it是一个字符。

你正在做reserved[*it],并且由于你给reserved( std::map<std::string, std::string>) 的类型,下标运算符需要 a string,而不是 a char

然后编译器尝试从charto的用户定义转换std::string,但没有构造函数string接受 a char。有一个接受 achar const*虽然(请参见此处),但编译器无法将 a 转换char为 a char const*; 因此,错误。

另请注意,您不应该使用, 而是unsigned返回的值。string::find()string::size_type

于 2013-02-18T13:36:48.853 回答
1

好吧,您的解决方案中的错误是您试图将单个字符而不是std::stringc 样式的 0 终止字符串 ( const char *) 传递给映射。

std::string::iterator一次迭代一个字符,因此您可能需要使用std::map< char, std::string >.

于 2013-02-18T13:36:53.520 回答
0

看起来 *it 的类型和什么不匹配

 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 回答