I found this piece of code on the site, it seems the author is long gone, anyway, I'm having hard time understanding the actual swap and how the reverse occurs:
void strrev2(char *str)
{
if( str == NULL )
return;
char *end_ptr = &str[strlen(str) - 1];
char temp;
while( end_ptr > str )
{
temp = *str;
*str++ = *end_ptr;
*end_ptr-- = temp;
}
}
let's say you feed it word "testing"
First iteration:
*end_ptr = 'g';
temp = 't'
*str = 'g' // is it first assigned and then incremented to point to the next location?
*end_ptr = 't' // is it first assigned and then decremented to point to the previous location?
What happens on the second iteration? I'm having hard time because I thought that on this line:
char *end_ptr = &str[strlen(str) - 1];
end_ptr
will only contain address of one letter, so how can *end_ptr
work?
Anyway, if someone can explain this to me in some graphical way.. Thanks.
str
and end_ptr
are just pointers to the start and end of the string. Each time round the loop their characters are swapped, and they are each moved one step towards the middle of the string. When they meet (or cross), the loop terminates.
Here's a picture...
1. testing s is str
^ ^ e is end_ptr
s e
2. gestint
^ ^
s e
3. gnitset
^
se
4. done!
(By the way, this is the start of a common interview question at companies that think brain-teasers make good interview questions. The question inevitably continues... so now, how would you use the same principle to reverse the words in a sentence, without reversing the letters in each word?)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With