#include <stdio.h>
#include <string.h>
#include <ctype.h>
// step 1. reverse the target sequence
// "abc 123 xyz" ==> "cba 123 xyz"
// ^^^ ^^^
// step 2. Reverse the entire sequence
// "cba 123 xyz" ==> "zyx 321 abc"
// step 3 Reverse the non-target sequence, not including the trailing space
// "zyx 321 abc " => "123 xyz abc"
// ^^^^^^^ ^^^^^^^
//
// repeat this (recursion or iteration, makes no difference) for
// the non-target segment, adjusting the end-marker to do so.
void reverse_letters(char *beg, char *end)
{
while (beg < --end)
{
char tmp = *beg;
*beg++ = *end;
*end = tmp;
}
}
char *reverse_words(char *beg, char *end)
{
// find whitespace. if none then we're done.
char *p = beg;
for (; p
!= end
&& !isspace((unsigned char)*p
); ++p
);
if (p != end)
{
reverse_letters(beg, p);
reverse_letters(beg, end);
reverse_letters(beg, beg + (end - p - 1));
reverse_words(beg, beg + (end - p - 1));
}
return beg;
}
int main()
{
char words[] = "abc 123 xyz";
reverse_words
(words
, words
+ strlen(words
)); return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPGN0eXBlLmg+CgovLyBzdGVwIDEuIHJldmVyc2UgdGhlIHRhcmdldCBzZXF1ZW5jZQovLyAiYWJjIDEyMyB4eXoiID09PiAiY2JhIDEyMyB4eXoiCi8vICBeXl4gICAgICAgICAgICAgICBeXl4KCi8vIHN0ZXAgMi4gUmV2ZXJzZSB0aGUgZW50aXJlIHNlcXVlbmNlCi8vICJjYmEgMTIzIHh5eiIgPT0+ICJ6eXggMzIxIGFiYyIKCi8vIHN0ZXAgMyBSZXZlcnNlIHRoZSBub24tdGFyZ2V0IHNlcXVlbmNlLCBub3QgaW5jbHVkaW5nIHRoZSB0cmFpbGluZyBzcGFjZQovLyAienl4IDMyMSBhYmMgIiA9PiAiMTIzIHh5eiBhYmMiCi8vICBeXl5eXl5eICAgICAgICAgICBeXl5eXl5eCi8vCi8vIHJlcGVhdCB0aGlzIChyZWN1cnNpb24gb3IgaXRlcmF0aW9uLCBtYWtlcyBubyBkaWZmZXJlbmNlKSBmb3IKLy8gIHRoZSBub24tdGFyZ2V0IHNlZ21lbnQsIGFkanVzdGluZyB0aGUgZW5kLW1hcmtlciB0byBkbyBzby4KCnZvaWQgcmV2ZXJzZV9sZXR0ZXJzKGNoYXIgKmJlZywgY2hhciAqZW5kKQp7CiAgICB3aGlsZSAoYmVnIDwgLS1lbmQpCiAgICB7CiAgICAgICAgY2hhciB0bXAgPSAqYmVnOwogICAgICAgICpiZWcrKyA9ICplbmQ7CiAgICAgICAgKmVuZCA9IHRtcDsKICAgIH0KfQoKY2hhciAqcmV2ZXJzZV93b3JkcyhjaGFyICpiZWcsIGNoYXIgKmVuZCkKewogICAgLy8gZmluZCB3aGl0ZXNwYWNlLiBpZiBub25lIHRoZW4gd2UncmUgZG9uZS4KICAgIGNoYXIgKnAgPSBiZWc7CiAgICBmb3IgKDsgcCAhPSBlbmQgJiYgIWlzc3BhY2UoKHVuc2lnbmVkIGNoYXIpKnApOyArK3ApOwogICAgCiAgICBpZiAocCAhPSBlbmQpCiAgICB7CiAgICAgICAgcmV2ZXJzZV9sZXR0ZXJzKGJlZywgcCk7CiAgICAgICAgcmV2ZXJzZV9sZXR0ZXJzKGJlZywgZW5kKTsKICAgICAgICByZXZlcnNlX2xldHRlcnMoYmVnLCBiZWcgKyAoZW5kIC0gcCAtIDEpKTsKICAgICAgICByZXZlcnNlX3dvcmRzKGJlZywgYmVnICsgKGVuZCAtIHAgLSAxKSk7CiAgICB9CiAgICAKICAgIHJldHVybiBiZWc7Cn0KCmludCBtYWluKCkKewogICAgY2hhciB3b3Jkc1tdID0gImFiYyAxMjMgeHl6IjsKICAgIHJldmVyc2Vfd29yZHMod29yZHMsIHdvcmRzICsgc3RybGVuKHdvcmRzKSk7CiAgICBwdXRzKHdvcmRzKTsKICAgIHJldHVybiAwOwp9Cg==