替换字符串时出现编译错误

时间:2013-02-18 13:29:09

标签: c++ map stl

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

为了存储特殊字符,我使用地图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&lt; _CharT,_Traits,_Alloc&gt; :: basic_string(const _CharT *,const _Alloc&amp;)的参数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;
}

3 个答案:

答案 0 :(得分:1)

it是字符的迭代器(类型为std::string::iterator)。因此,*it是一个角色。

您正在执行reserved[*it],并且由于您为reservedstd::map<std::string, std::string>)提供的类型,下标运算符需要string,而不是char }。

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

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

答案 1 :(得分:1)

嗯,您的解决方案中的错误是您尝试传递单个字符而不是std::string或c样式0终止字符串(const char *)来映射。

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

答案 2 :(得分:0)

看起来*它的类型和什么

之间存在不匹配
 reservedChars.find() 

应该接受。

尝试添加

const char* pit = *it;

之前

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

    if(found != string::npos){

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