C, 62 58 58 54 bytes
Thanks to @Dennis for saving four four eight bytes!
f(char*s){*++s>32||(s[-1]^=s[-2]^=s[-1]^=s[-2]);*s&&f(s);}
Recursive version (58 bytes):
f(char*s){*++s-32&&*s||s[1]>32||(s[-1]^=s[-2]^=s[*s^=s[-1]^=s[1]^=*s^=s[-2]1]);*s&&f;*++s&&f(s);}