Revert words-order in text no using additional memory
For example, string"Fedora Project promotes internet freedom" should be translated to
"freedom internet promotes Project Fedora" [nice semantic palindrome, isn't it? :-)].
Doesn't looks hard, but the only solution I found is to inverse all text, and then inverse each word.
#include <stdio.h>
#include <string.h>
/* invert characters in range [beg; end) */
inline void inv(char *beg, char *end)
{
end--;
while(beg < end) {
char c = *beg;
*beg++ = *end;
*end-- = c;
}
}
int main(int argc, char *argv[])
{
char *s = argv[1], *beg = s, *end = strchr(s, '\0');
inv(beg, end);
beg = s;
while(*beg)
{
end = strchr(beg, ' ') ? : strchr(beg, '\0');
inv(beg, end);
beg = end + 1;
}
printf("%s\n", s);
return 0;
}
The problem is we have to scan string twice. Maybe there is a better (by-algo, not especially by-speed) solution?BTW, nice construction which is used everywhere in Linux kernel
x = y ? : z; // equals to "if(y) x = y; else x = z;"
No comments:
Post a Comment