<div dir="ltr">Hi, Quang<div><br></div><div>I confirmed that the bug was fixed.</div><div>Thank you for coping with the problem.</div><div><br></div><div>--------</div><div><div>// [[Rcpp::export]]</div><div>void rcpp_string(){</div><div>  </div><div>  String s("AABCDABCDA");</div><div>  Rcout << "replace_all()\n";</div><div>  Rcout << s.replace_all("AB", "ab").get_cstring()  << "\n";</div><div>  Rcout << "\n";</div><div>  </div><div>  s="AABCDABCDA";</div><div>  Rcout << "replace_first()\n";</div><div>  Rcout << s.replace_first("AB", "ab").get_cstring() << "\n";</div><div>  Rcout << "\n";</div><div>  </div><div>  s="AABCDABCDA";</div><div>  Rcout << "replace_last()\n";</div><div>  Rcout << s.replace_last("AB", "ab").get_cstring()  << "\n";</div><div>  Rcout << "\n";</div><div>  </div><div>}</div></div><div>---------</div><div><div>> rcpp_string()</div><div>replace_all()</div><div>AabCDabCDA</div><div><br></div><div>replace_first()</div><div>AabCDABCDA</div><div><br></div><div>replace_last()</div><div>AABCDabCDA</div></div><div><br></div></div><div class="gmail_extra"><br clear="all"><div><div class="gmail_signature"><div dir="ltr">-------------------------------------------------------------------<br>    <br>     Masaki Tsuda<br><span style="font-family:arial,sans-serif">     E-mail : </span><a href="mailto:teuder@gmail.com" style="font-family:arial,sans-serif" target="_blank">teuder@gmail.com</a><br></div></div></div>
<br><div class="gmail_quote">2016-05-17 12:03 GMT+09:00 Qiang Kou <span dir="ltr"><<a href="mailto:qkou@umail.iu.edu" target="_blank">qkou@umail.iu.edu</a>></span>:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">Hi, Masaki,<div><br></div><div>Please try the latest version on github. It should fix this bug.</div><div><br></div><div>KK</div></div><div class="HOEnZb"><div class="h5"><div class="gmail_extra"><br><div class="gmail_quote">On Mon, May 16, 2016 at 9:42 PM,  <span dir="ltr"><<a href="mailto:teuder@gmail.com" target="_blank">teuder@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="auto"><div><span><div style="color:rgb(69,69,69);text-decoration:-webkit-letterpress">Hi, Kevin and Qiang.</div><div style="color:rgb(69,69,69);text-decoration:-webkit-letterpress"><br></div><span style="color:rgb(69,69,69);text-decoration:-webkit-letterpress">After I sent my first post, I realized the problem as you pointed out.</span><div style="color:rgb(69,69,69);text-decoration:-webkit-letterpress"><br></div><div style="color:rgb(69,69,69);text-decoration:-webkit-letterpress">The problem can be resolved by replacing replace_first() and replace_last() to find() and rfind().</div><div style="color:rgb(69,69,69);text-decoration:-webkit-letterpress"><br></div></span><div style="color:rgb(69,69,69);text-decoration:-webkit-letterpress"><span style="background-color:rgba(255,255,255,0)">-------------------<br>inline String& replace_first(const char* s, const char* news) {<br>   RCPP_STRING_DEBUG_2("String::replace_first(const char* = '%s' , const<span><br>char* = '%s')", s, news);<br>   if (is_na()) return *this;<br>   setBuffer();<br></span><span>   size_t index = buffer.find(s);<br>   //size_t index = buffer.find_first_of(s);<br></span><span>   if (index != std::string::npos) buffer.replace(index, strlen(s), news);<br>   valid = false;<br>   return *this;<br>}<br><br></span><span>inline String& replace_last(const char* s, const char* news) {<br>   RCPP_STRING_DEBUG_2("String::replace_last(const char* = '%s' , const<br>char* = '%s')", s, news);<br>   if (is_na()) return *this;<br>   setBuffer();<br></span><span>   size_t index = buffer.rfind(s);<br>   //size_t index = buffer.find_last_of(s);<br></span><span>   if (index != std::string::npos) buffer.replace(index, strlen(s), news);<br>   valid = false;<br>   return *this;<br>}<br></span>-------------------</span></div><span><div style="color:rgb(69,69,69);text-decoration:-webkit-letterpress"><span style="background-color:rgba(255,255,255,0)">> rcpp_string()</span><span style="background-color:rgba(255,255,255,0)"><br></span><span style="background-color:rgba(255,255,255,0)">replace_all()<br>AabCDabCDA<br><br>replace_first()<br>AabCDABCDA<br><br>replace_last()<br>AABCDabCDA<br>-------------------</span><br style="color:rgb(0,0,0)"></div><div style="color:rgb(69,69,69);text-decoration:-webkit-letterpress"><span style="background-color:rgba(255,255,255,0)"><br></span></div><div style="color:rgb(69,69,69);text-decoration:-webkit-letterpress"><span style="background-color:rgba(255,255,255,0)">Regards</span></div><div style="color:rgb(69,69,69);text-decoration:-webkit-letterpress"><span style="background-color:rgba(255,255,255,0)"><br></span></div><div style="color:rgb(69,69,69);text-decoration:-webkit-letterpress"><span style="background-color:rgba(255,255,255,0)">Masaki</span></div><div style="color:rgb(69,69,69);text-decoration:-webkit-letterpress"><span style="background-color:rgba(255,255,255,0)"><br></span></div><div style="color:rgb(69,69,69);text-decoration:-webkit-letterpress"><span style="background-color:rgba(255,255,255,0)"><br></span></div><br><div>Masaki Tsuda</div><div><a href="mailto:teuder@gmail.com" target="_blank">teuder@gmail.com</a></div></span></div><span><div><br>2016/05/17 5:57、Qiang Kou <<a href="mailto:qkou@umail.iu.edu" target="_blank">qkou@umail.iu.edu</a>> のメッセージ:<br><br></div></span><div><div><blockquote type="cite"><div><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><div><br>
On Sun, May 8, 2016 at 6:14 AM, 津田真樹 <<a href="mailto:teuder@gmail.com" target="_blank">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" target="_blank">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" target="_blank">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><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>
</div></blockquote></div></div></div></blockquote></div><br><br clear="all"><div><br></div>-- <br><div><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>
</div></div></blockquote></div><br></div>