如题,代码如下:
void reverse_words(std::string& original)
{
int n = original.size();
char* p = &original.front(); // scan ptr
static const int NBUF = 8;
char buf[NBUF];
// truncate back whitespace
int offset = 0;
for(; offset < n;) {
// reverse scan until ' ';
auto wspos = original.find_last_of(' ');
if (wspos != std::string::npos) {
// move word to front
// move the whole buffer to
char* frag = &original[wspos + 1];
int frag_len = original.size() - wspos - 1;
int frag_avails = frag_len; // "fds fd";
while (frag_avails > 0 && offset < n) {
// cache words to buf
int nstored = std::min(NBUF, frag_avails); // 7
int frag_offset = 0;
if (frag_avails > NBUF)
frag_offset = std::max(0, std::abs(frag_avails - NBUF));
else
frag_offset = frag_len - frag_avails;
memcpy(buf, frag + frag_offset, nstored);
frag_avails -= nstored;
// move whole buf to for take place
memmove(p + nstored + offset, p + offset, n - nstored - offset);
memcpy(p + offset, buf, nstored);
// offset += nstored;
}
offset += frag_len;
if (offset < n) {
// move all witespace // efb abc
auto nextwords = original.find_last_not_of(' ');
if (nextwords != std::string::npos) {
int nws = n - nextwords - 1; // numbers of wihtespace
if (nws > 0) {
memmove(p + nws + offset, p + offset, n - nws - offset);
memset(p + offset, ' ', nws);
offset += nws;
}
}
}
}
else { // on word, do nothing
break;
}
}
}