std :: replace дает ошибку - PullRequest
       14

std :: replace дает ошибку

2 голосов
/ 01 марта 2012

Я пытаюсь преобразовать путь к файлу, который имеет только одну косую черту, чтобы двойную косую черту, как показано в коде ниже. но это дает мне ошибку, показанную в конце

    #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> :: replace (unsigned int, unsigned int, const _Elem *, unsigned int)': невозможно преобразовать параметр 1 от 'std :: _ String_iterator <_Elem, _Traits, _Alloc>' до 'unsigned int'

Ответы [ 3 ]

2 голосов
/ 01 марта 2012

replace не может заменить один символ '\\' двумя символами "\\\\".Сигнатура метода шаблона требует const T& для последних двух параметров, но вы передаете строку вместо символа.

Вот как вы можете сделать то, что вам нужно:

int p = 0;
while ((p = file_path.find('\\', p)) != string::npos) {
    file_path.insert(p, "\\");
    p += 2;
}
1 голос
/ 01 марта 2012

Вы пытаетесь заменить тип char строкой - для замены требуется, чтобы типы были одинаковыми: 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, "\\", "\\\\");

0 голосов
/ 01 марта 2012

copy, replace, transform и некоторые другие алгоритмы не могут создавать больше элементов, чем существует в их диапазоне ввода. (от всей души не могу придумать ни одного стандартного алгоритма, который бы позволял это)

Вы можете использовать regex_replace, чтобы сделать это:

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