没有匹配函数来调用'replace(std :: basic_string <char> :: iterator,std :: basic_string <char> :: iterator,char,int)'|

时间:2017-11-29 21:02:21

标签: c++ replace

如何将所有\更改为\\

我想创建使用文件的地址:

#include <iostream>
#include <string>
#include <algorithm>
using namespace std;

int main()
{
    string str = "C:\\user\\asd";
    replace(str.begin(), str.end(), '\\', '\\\\');
    cout << str;
    return 0;
}

我收到错误:

  

F:\ c ++ \ tests \ regex \ main.cpp | 8 | error:没有用于调用'replace(std :: basic_string&lt; char&gt; :: iterator,std :: basic_string&lt; char&gt; :: iterator)的匹配函数,char,int)'|

如何使用C ++中的char数组(没有函数)来完成这项工作?

1 个答案:

答案 0 :(得分:1)

您使用的是std::replace(),它取代了迭代器范围内的值。在这种情况下,您正在使用std::string中的迭代器,因此要搜索的值以及要替换它的值必须都是单char个值。但是,'\\\\'是一个多字节字符,因此无法用作char值。这就是你得到编译器错误的原因。

std::string有自己的重载replace()方法,其中一些方法可以用多字符字符串替换std::string的部分。

请尝试这样做,例如:

#include <iostream>
#include <string>
using namespace std;

int main()
{
    string str = "C:\\user\\asd";

    string::size_type pos = 0;    
    while ((pos = str.find('\\', pos)) != string::npos)
    {
        str.replace(pos, 1, "\\\\");
        pos += 2;
    }

    cout << str;
    return 0;
}

Live demo

但是,你说你&#34;想要使用地址来处理文件&#34;,这对我来说意味着你要创建一个file: URI。如果是这样,那么你需要更像这样的东西(这是一个严重的过度简化,正确的 URI生成器会比URIs have many rules to them更复杂,但是这会让你启动):

#include <iostream>
#include <string>
#include <sstream>
#include <iomanip>
using namespace std;

const char* safe_chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._~!$&'()*+,;=:@/";

int main()
{
    string str = "C:\\user\\ali baba";

    replace(str.begin(), str.end(), '\\', '/');

    string::size_type pos = 0;
    while ((pos = str.find_first_not_of(safe_chars, pos)) != string::npos)
    {
        ostringstream oss;
        oss << '%' << hex << noshowbase << uppercase << (int) str[pos];
        string newvalue = oss.str();
        str.replace(pos, 1, newvalue);
        pos += newvalue.size();
    }

    str = "file:///" + str;

    cout << str;
    return 0;
}

Live demo