Страницы

Поиск по вопросам

суббота, 4 января 2020 г.

Замена символов в строке

#cpp #парсер #символы #замена


У меня есть строка: "''Start''".
После всех действий над ней, должно получиться: "Start". Т.е удаляются все символы
",  а затем все пары символов '' заменяются на ".
Удаляю из нее все символы ":
result.erase(std::remove(result.begin(), result.end(), '"' ), result.end());

Затем нужно заменить все пары символов '' на ":
replace(result.begin(), result.end(), "\'\'", "\"");

Выдает ошибку следующую ошибку: 

tools/data_parser.cpp: In function ‘int main(int, const char**)’:
tools/data_parser.cpp:21:52: error: no matching function for call to ‘replace(std::__cxx11::basic_string::iterator,
std::__cxx11::basic_string::iterator, const char [3], const char [2])’
  replace(result.begin(), result.end(), "\'\'", "\"");
                                                    ^
In file included from /usr/include/c++/5/algorithm:62:0,
                 from tools/data_parser.cpp:7:
/usr/include/c++/5/bits/stl_algo.h:4233:5: note: candidate: template void std::replace(_FIter, _FIter, const _Tp&, const _Tp&)
     replace(_ForwardIterator __first, _ForwardIterator __last,
     ^
/usr/include/c++/5/bits/stl_algo.h:4233:5: note:   template argument deduction/substitution
failed:
tools/data_parser.cpp:21:52: note:   deduced conflicting types for parameter ‘const
_Tp’ (‘char [3]’ and ‘char [2]’)
  replace(result.begin(), result.end(), "\'\'", "\"");


Я так понимаю, что std::replace заменяет только один символ на другой. Как заменить
пару символов? Компилирую так: g++-5 -std=c++11 cfg_parser.cpp -o cfg_parser
    


Ответы

Ответ 1



Если я вас правильно понял, то вы можете выполнить задачу следующим образом #include #include #include int main() { std::string s( "\"''Start''\"" ); std::cout << '[' << s << ']' << std::endl; s.erase( std::remove( s.begin(), s.end(), '"' ), s.end() ); for ( std::string::size_type n = 0; ( n = s.find( "''", n ) ) != std::string::npos; ++n ) { s.replace( n, 2, 1, '"' ); } std::cout << '[' << s << ']' << std::endl; } Программа имеем следующий вывод на консоль: ["''Start''"] ["Start"]

Ответ 2



Просто, быстро и (надеюсь) надежно #include #include char * replq (char *str) { int i, j; for (i = j = 0; str[i]; i++) if (str[i] != '"') { if (str[i] == '\'' && str[i + 1] == '\'') { str[j++] = '"'; i++; } else str[j++] = str[i]; } str[j] = 0; return str; } int main (int ac, char *av[]) { char str[1000]; while (fgets(str, 1000, stdin)) puts(replq(str)); return puts("End") == EOF; } По поводу Си -- конечно это Си (но g++ признает код своим, т.е. крестовым).

Ответ 3



std::replace действительно заменяет лишь символы. Вам нужно воспользоваться string::replace. string haystack = "''text''"; string needle = "''"; size_t pos; while ((pos = haystack.find(needle)) != haystack.npos) haystack.replace(pos, pos + needle.length(), "\""); Проверка: http://ideone.com/zxa0Rn Впрочем, это по сути не отличается от варианта @Vlad from Moscow

Ответ 4



/*********************************************************** * Method: fn_Replace * Description Замена одного символа в строке на один символ или строку * Returns: void * Parameter: wstring & ws - исходная строка * Parameter: const wchar_t wchF - один заменяемый символ * Parameter: LPCTSTR wchR - замена, символ или строка символов ************************************************************/ void fn_Replace(wstring& ws, const wchar_t wchF, LPCTSTR wchR) { size_t sz = ws.size(); for(size_t i = 0; i < sz; ++i) { if(ws[i] != wchF) continue; else ws.replace(i,1,wchR); } }

Комментариев нет:

Отправить комментарий