[Rcpp-devel] Bug report : String::replace_first() and String::replace_last()
津田真樹
teuder at gmail.com
Sat May 14 16:42:56 CEST 2016
Hello, all
This is my first post to this mailing list.
I might have found bugs with String::replace_first() and String::replace_last().
The bugs can be reproduced by following code.
(R version 3.2.3 Rcpp 0.12.4)
-------------------
// [[Rcpp::export]]
void rcpp_string(){
String s("AABCDABCDA");
Rcout << "replace_all()\n";
Rcout << s.replace_all("AB", "ab").get_cstring() << "\n";
Rcout << "\n";
s="AABCDABCDA";
Rcout << "replace_first()\n";
Rcout << s.replace_first("AB", "ab").get_cstring() << "\n";
Rcout << "\n";
s="AABCDABCDA";
Rcout << "replace_last()\n";
Rcout << s.replace_last("AB", "ab").get_cstring() << "\n";
Rcout << "\n";
}
-------------------
> rcpp_string()
replace_all()
AabCDabCDA
replace_first()
abBCDABCDA
replace_last()
AABCDABCDab
-------------------
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().
-------------------
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
More information about the Rcpp-devel
mailing list