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