std :: replace给出了错误

时间:2012-03-01 16:53:36

标签: c++ string replace str-replace

我正在尝试将只有一个斜杠的文件路径转换为双斜杠,如下面的代码所示。 但它给了我最后显示的错误

    #include<algorithm>

    std::string file_path;
    using std::replace;
     while(fgets(fname_buffer,1024,flist))
   {
    token = strtok( fname_buffer," ,\t");
    file_size=atol(token);

    token = strtok(NULL, " ,\t"); 
   strncpy((char*)file_fp,token,32);
   file_fp[32]='\0';

    token = strtok(NULL, "\n");
    file_path=token;
    replace(file_path.begin(),file_path.end(),'\\',"\\\\");
    //file_path.replace(file_path.begin(),file_path.end(),'\\','\\\\');
  

错误C2664:'std :: basic_string&lt; _Elem,_Traits,_Ax&gt; &amp; std :: basic_string&lt; _Elem,_Traits,_Ax&gt; :: replace(unsigned int,unsigned int,const _Elem *,unsigned int)':无法从'std :: _ St​​ring_iterator&lt; _Elem,_Traits,_Alloc&gt;'转换参数1 'unsigned int'

3 个答案:

答案 0 :(得分:2)

replace无法用两个字符'\\'替换一个字符"\\\\"。对于最后两个参数,模板方法的签名需要const T&,但是您传递的是字符串而不是字符。

以下是您可以做的事情:

int p = 0;
while ((p = file_path.find('\\', p)) != string::npos) {
    file_path.insert(p, "\\");
    p += 2;
}

答案 1 :(得分:1)

您正在尝试用字符串替换char类型 - replace要求类型相同:
const T&amp; 在两种情况下都应该{{1} }。

char

以下是您可能会发现有用的代码段:
(通过重复调用template < class ForwardIterator, class T > void replace ( ForwardIterator first, ForwardIterator last, const T& old_value, const T& new_value ); 直到字符串结束为止)

std::string::replace()

在你的情况下,你会像这样使用它:

std::string& sReplaceAll(std::string& sS, const std::string& sWhat, const std::string& sReplacement) { size_t pos = 0, fpos; while ((fpos = sS.find(sWhat, pos)) != std::string::npos) { sS.replace(fpos, sWhat.size(), sReplacement); pos = fpos + sReplacement.size(); } return sS; }

答案 2 :(得分:0)

copyreplacetransform和其他一些算法无法创建比输入范围内更多的元素。 (在我的脑海中,我无法想到任何允许这样做的标准算法)

您可以使用regex_replace执行此操作:

file_path = std::regex_replace(file_path,std::regex("\\"),"\\\\");