我正在尝试将只有一个斜杠的文件路径转换为双斜杠,如下面的代码所示。 但它给了我最后显示的错误
#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 :: _ String_iterator&lt; _Elem,_Traits,_Alloc&gt;'转换参数1 'unsigned int'
答案 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)
copy
,replace
,transform
和其他一些算法无法创建比输入范围内更多的元素。 (在我的脑海中,我无法想到任何允许这样做的标准算法)
您可以使用regex_replace
执行此操作:
file_path = std::regex_replace(file_path,std::regex("\\"),"\\\\");