std :: replace给出了错误
我想转换一个文件路径,只有一个斜杠为双斜线,如下面的代码所示。 但它给了我在最后显示的错误std :: 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的< _Elem,_Traits,_AX> &的std :: basic_string的< _Elem,_Traits,_AX> ::更换(无符号整数,无符号整型,常量_Elem *,无符号整型)的std :: _ String_iterator < _Elem,_Traits,_Alloc>”不能转换参数1 '' 到 '无符号整型'
replace
不能代替一个字符'\\'
两个字符"\\\\"
。模板方法的签名要求最后两个参数为const T&
,但是您传递的是字符串而不是字符。
这里是你如何能做到你所需要的:
int p = 0;
while ((p = file_path.find('\\', p)) != string::npos) {
file_path.insert(p, "\\");
p += 2;
}
这应该是'file_path。插入(p,“\\\\”);' – 2012-03-04 05:30:26
@AgnelKurian否,不是真的:其他斜线已经存在。 – dasblinkenlight 2012-03-04 05:31:49
对!我现在明白了。 – 2012-03-04 05:36:27
你试图取代带字符串的字符型 - 替换要求类型相同:
const T &在两种情况下,这应该是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;
}
你的情况,你可以使用这样的:
sReplaceAll(file_path, "\\", "\\\\");
copy
,replace
,transform
和其他一些算法不能创造出比它们的输入范围存在更多的元素。 (从我的头顶,我想不出任何标准算法那些允许这样)
您可以使用regex_replace
做到这一点:
file_path = std::regex_replace(file_path,std::regex("\\"),"\\\\");
使用[这里](HTTP:// WWW。 boost.org/doc/libs/1_49_0/doc/html/boost/algorithm/replace_all.html)。它比搜索替换重复算法好得多。 – 2012-03-01 17:36:24