<div dir="ltr"><div><div class="gmail_signature"><div dir="ltr"><div dir="ltr">Hello, all</div><div dir="ltr"><br></div><div dir="ltr">This is my first post to this mailing list.</div><div dir="ltr"><br></div><div dir="ltr">I might have found bugs with String::replace_first() and  String::replace_last().</div><div dir="ltr">The bugs can be reproduced by following code.</div><div dir="ltr">(R version 3.2.3  Rcpp 0.12.4)</div><div dir="ltr"><br></div><div dir="ltr">-------------------</div><div dir="ltr">// [[Rcpp::export]]</div><div dir="ltr">void rcpp_string(){</div><div dir="ltr">    </div><div dir="ltr">    String s("AABCDABCDA");</div><div dir="ltr">    Rcout << "replace_all()\n";</div><div dir="ltr">    Rcout << s.replace_all("AB", "ab").get_cstring()  << "\n";</div><div dir="ltr">    Rcout << "\n";</div><div dir="ltr">    </div><div dir="ltr">    s="AABCDABCDA";</div><div dir="ltr">    Rcout << "replace_first()\n";</div><div dir="ltr">    Rcout << s.replace_first("AB", "ab").get_cstring() << "\n";</div><div dir="ltr">    Rcout << "\n";</div><div dir="ltr">    </div><div dir="ltr">    s="AABCDABCDA";</div><div dir="ltr">    Rcout << "replace_last()\n";</div><div dir="ltr">    Rcout << s.replace_last("AB", "ab").get_cstring()  << "\n";</div><div dir="ltr">    Rcout << "\n";</div><div dir="ltr">    </div><div dir="ltr">}</div><div dir="ltr">-------------------</div><div dir="ltr">> rcpp_string()</div><div dir="ltr">replace_all()</div><div dir="ltr">AabCDabCDA</div><div dir="ltr"><br></div><div dir="ltr">replace_first()</div><div dir="ltr">abBCDABCDA</div><div dir="ltr"><br></div><div dir="ltr">replace_last()</div><div dir="ltr">AABCDABCDab</div><div dir="ltr">-------------------</div><div dir="ltr"><br></div><div dir="ltr">The problem is caused by find_first_of() and find_last_of() and it can be resolved by replacing these functions to find() and rfind().</div><div dir="ltr"><br></div><div dir="ltr">-------------------</div><div dir="ltr">inline String& replace_first(const char* s, const char* news) {</div><div dir="ltr">    RCPP_STRING_DEBUG_2("String::replace_first(const char* = '%s' , const char* = '%s')", s, news);</div><div dir="ltr">    if (is_na()) return *this;</div><div dir="ltr">    setBuffer();</div><div dir="ltr">    size_t index = buffer.find(s);</div><div dir="ltr">    //size_t index = buffer.find_first_of(s);</div><div dir="ltr">    if (index != std::string::npos) buffer.replace(index, strlen(s), news);</div><div dir="ltr">    valid = false;</div><div dir="ltr">    return *this;</div><div dir="ltr">}</div><div dir="ltr"><br></div><div dir="ltr">inline String& replace_last(const char* s, const char* news) {</div><div dir="ltr">    RCPP_STRING_DEBUG_2("String::replace_last(const char* = '%s' , const char* = '%s')", s, news);</div><div dir="ltr">    if (is_na()) return *this;</div><div dir="ltr">    setBuffer();</div><div dir="ltr">    size_t index = buffer.rfind(s);</div><div dir="ltr">    //size_t index = buffer.find_last_of(s);</div><div dir="ltr">    if (index != std::string::npos) buffer.replace(index, strlen(s), news);</div><div dir="ltr">    valid = false;</div><div dir="ltr">    return *this;</div><div dir="ltr">}</div><div dir="ltr">-------------------</div><div dir="ltr">> rcpp_string()</div><div dir="ltr">replace_all()</div><div dir="ltr">AabCDabCDA</div><div dir="ltr"><br></div><div dir="ltr">replace_first()</div><div dir="ltr">AabCDABCDA</div><div dir="ltr"><br></div><div dir="ltr">replace_last()</div><div dir="ltr">AABCDabCDA</div><div dir="ltr">-------------------</div><div dir="ltr"><br></div><div dir="ltr">Regards</div><div dir="ltr"><br></div><div dir="ltr">-------------------------------------------------------------------</div><div dir="ltr">    </div><div dir="ltr">     Masaki Tsuda</div><div dir="ltr">     E-mail : <a href="mailto:teuder@gmail.com">teuder@gmail.com</a></div><div><br></div></div></div></div>
</div>