<div dir="ltr">Yes, Kevin,<div><br></div><div>I think we need something like</div><div><br></div><div>size_t index = std::distance(buffer.begin(), std::search(buffer.begin(), buffer.end(), s.begin(), s.end()));<br></div><div><br></div><div>KK</div></div><div class="gmail_extra"><br><div class="gmail_quote">On Mon, May 16, 2016 at 2:04 PM, Kevin Ushey <span dir="ltr"><<a href="mailto:kevinushey@gmail.com" target="_blank">kevinushey@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Thanks -- it looks to me like there is something more fundamentally<br>
wrong with the 'replace_first' and 'replace_last' methods; ie, I don't<br>
think we want to be using 'find_first_of' and 'find_last_of'<br>
functions.<br>
<br>
Ie, when writing<br>
<br>
    string.replace_first("foo", "bar");<br>
<br>
I imagine we want to replace the first occurrence of 'foo' with 'bar',<br>
and not the first discovered character of 'f' and 'o'.<br>
<br>
A simple repro for the bogus behavior:<br>
<br>
#include <Rcpp.h><br>
using namespace Rcpp;<br>
<br>
// [[Rcpp::export]]<br>
String replace() {<br>
  String foo("abba");<br>
  return foo.replace_first("ba", "BA");<br>
}<br>
<br>
/*** R<br>
replace()<br>
*/<br>
<br>
gives<br>
<br>
> replace()<br>
[1] "BAba"<br>
<br>
which is I doubt what anyone would expect.<br>
<div class="HOEnZb"><div class="h5"><br>
On Sun, May 8, 2016 at 6:14 AM, 津田真樹 <<a href="mailto:teuder@gmail.com">teuder@gmail.com</a>> wrote:<br>
> I find a bug in String::replace_last().<br>
><br>
> I can reproduce the bug with the following code.<br>
> (I also showed output of replace_first and replace_all for comparison.)<br>
><br>
><br>
> =============<br>
> // [[Rcpp::export]]<br>
> void rcpp_string(){<br>
><br>
>     String s("abcdabcd");<br>
>     Rcout << "replace_first()\n";<br>
>     Rcout << s.replace_first("ab", "AB").get_cstring() << "\n";<br>
>     Rcout << "\n";<br>
><br>
>     s="abcdabcd";<br>
>     Rcout << "replace_last()\n";<br>
>     Rcout << s.replace_last("ab", "AB").get_cstring()  << "\n";<br>
>     Rcout << "\n";<br>
><br>
>     s="abcdabcd";<br>
>     Rcout << "replace_all()\n";<br>
>     Rcout << s.replace_all("ab", "AB").get_cstring()  << "\n";<br>
>     Rcout << "\n";<br>
> }<br>
> =============<br>
><br>
> output<br>
> =============<br>
> replace_first()<br>
> ABcdabcd<br>
><br>
> replace_last()<br>
> abcdaABd<br>
><br>
> replace_all()<br>
> ABcdABcd<br>
> =============<br>
><br>
><br>
> I also tried to fix the bug with following code. And the bug seems to be fixed.<br>
><br>
> =============<br>
> inline String& replace_last(const char* s, const char* news) {<br>
>     RCPP_STRING_DEBUG_2("String::replace_last(const char* = '%s' , const char* = '%s')", s, news);<br>
>     if (is_na()) return *this;<br>
>     setBuffer();<br>
>     //size_t index = buffer.find_last_of(s);<br>
>     size_t index = buffer.find_last_of(s) - (strlen(s)-1);<br>
>     Rcout << "A" << index << "\n";<br>
>     if (index != std::string::npos) buffer.replace(index, strlen(s), news);<br>
>     valid = false;<br>
>     return *this;<br>
> }<br>
> =============<br>
><br>
> output<br>
> =============<br>
> replace_first()<br>
> ABcdabcd<br>
><br>
> replace_last()<br>
> abcdABcd<br>
><br>
> replace_all()<br>
> ABcdABcd<br>
> =============<br>
><br>
><br>
> Mac OS 10.10.5<br>
> R version 3.2.3<br>
> Rcpp 0.12.4<br>
><br>
><br>
> _______________________________________________<br>
> Rcpp-devel mailing list<br>
> <a href="mailto:Rcpp-devel@lists.r-forge.r-project.org">Rcpp-devel@lists.r-forge.r-project.org</a><br>
> <a href="https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel" rel="noreferrer" target="_blank">https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel</a><br>
_______________________________________________<br>
Rcpp-devel mailing list<br>
<a href="mailto:Rcpp-devel@lists.r-forge.r-project.org">Rcpp-devel@lists.r-forge.r-project.org</a><br>
<a href="https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel" rel="noreferrer" target="_blank">https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel</a></div></div></blockquote></div><br><br clear="all"><div><br></div>-- <br><div class="gmail_signature"><div dir="ltr">Qiang Kou<div><a href="mailto:qkou@umail.iu.edu" target="_blank">qkou@umail.iu.edu</a><br><div>School of Informatics and Computing, Indiana University</div><div><br></div></div></div></div>
</div>