#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); } }
Комментариев нет:
Отправить комментарий