Hi, Kevin and Qiang. After I sent my first post, I realized the problem as you pointed out.
The problem can be resolved by replacing replace_first() and replace_last() to find() and rfind(). ------------------- inline String& replace_first(const char* s, const char* news) { RCPP_STRING_DEBUG_2("String::replace_first(const char* = '%s' , const char* = '%s')", s, news); if (is_na()) return *this; setBuffer(); size_t index = buffer.find(s); //size_t index = buffer.find_first_of(s); if (index != std::string::npos) buffer.replace(index, strlen(s), news); valid = false; return *this; } inline String& replace_last(const char* s, const char* news) { RCPP_STRING_DEBUG_2("String::replace_last(const char* = '%s' , const char* = '%s')", s, news); if (is_na()) return *this; setBuffer(); size_t index = buffer.rfind(s); //size_t index = buffer.find_last_of(s); if (index != std::string::npos) buffer.replace(index, strlen(s), news); valid = false; return *this; } ------------------- > rcpp_string() replace_all() AabCDabCDA replace_first() AabCDABCDA replace_last() AABCDabCDA ------------------- Regards Masaki Masaki Tsuda teu...@gmail.com 2016/05/17 5:57、Qiang Kou <q...@umail.iu.edu> のメッセージ: > Yes, Kevin, > > I think we need something like > > size_t index = std::distance(buffer.begin(), std::search(buffer.begin(), > buffer.end(), s.begin(), s.end())); > > KK > >> On Mon, May 16, 2016 at 2:04 PM, Kevin Ushey <kevinus...@gmail.com> wrote: >> Thanks -- it looks to me like there is something more fundamentally >> wrong with the 'replace_first' and 'replace_last' methods; ie, I don't >> think we want to be using 'find_first_of' and 'find_last_of' >> functions. >> >> Ie, when writing >> >> string.replace_first("foo", "bar"); >> >> I imagine we want to replace the first occurrence of 'foo' with 'bar', >> and not the first discovered character of 'f' and 'o'. >> >> A simple repro for the bogus behavior: >> >> #include <Rcpp.h> >> using namespace Rcpp; >> >> // [[Rcpp::export]] >> String replace() { >> String foo("abba"); >> return foo.replace_first("ba", "BA"); >> } >> >> /*** R >> replace() >> */ >> >> gives >> >> > replace() >> [1] "BAba" >> >> which is I doubt what anyone would expect. >> >> On Sun, May 8, 2016 at 6:14 AM, 津田真樹 <teu...@gmail.com> wrote: >> > I find a bug in String::replace_last(). >> > >> > I can reproduce the bug with the following code. >> > (I also showed output of replace_first and replace_all for comparison.) >> > >> > >> > ============= >> > // [[Rcpp::export]] >> > void rcpp_string(){ >> > >> > String s("abcdabcd"); >> > Rcout << "replace_first()\n"; >> > Rcout << s.replace_first("ab", "AB").get_cstring() << "\n"; >> > Rcout << "\n"; >> > >> > s="abcdabcd"; >> > Rcout << "replace_last()\n"; >> > Rcout << s.replace_last("ab", "AB").get_cstring() << "\n"; >> > Rcout << "\n"; >> > >> > s="abcdabcd"; >> > Rcout << "replace_all()\n"; >> > Rcout << s.replace_all("ab", "AB").get_cstring() << "\n"; >> > Rcout << "\n"; >> > } >> > ============= >> > >> > output >> > ============= >> > replace_first() >> > ABcdabcd >> > >> > replace_last() >> > abcdaABd >> > >> > replace_all() >> > ABcdABcd >> > ============= >> > >> > >> > I also tried to fix the bug with following code. And the bug seems to be >> > fixed. >> > >> > ============= >> > inline String& replace_last(const char* s, const char* news) { >> > RCPP_STRING_DEBUG_2("String::replace_last(const char* = '%s' , const >> > char* = '%s')", s, news); >> > if (is_na()) return *this; >> > setBuffer(); >> > //size_t index = buffer.find_last_of(s); >> > size_t index = buffer.find_last_of(s) - (strlen(s)-1); >> > Rcout << "A" << index << "\n"; >> > if (index != std::string::npos) buffer.replace(index, strlen(s), news); >> > valid = false; >> > return *this; >> > } >> > ============= >> > >> > output >> > ============= >> > replace_first() >> > ABcdabcd >> > >> > replace_last() >> > abcdABcd >> > >> > replace_all() >> > ABcdABcd >> > ============= >> > >> > >> > Mac OS 10.10.5 >> > R version 3.2.3 >> > Rcpp 0.12.4 >> > >> > >> > _______________________________________________ >> > Rcpp-devel mailing list >> > Rcpp-devel@lists.r-forge.r-project.org >> > https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel >> _______________________________________________ >> Rcpp-devel mailing list >> Rcpp-devel@lists.r-forge.r-project.org >> https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel > > > > -- > Qiang Kou > q...@umail.iu.edu > School of Informatics and Computing, Indiana University >
_______________________________________________ Rcpp-devel mailing list Rcpp-devel@lists.r-forge.r-project.org https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel