## 【我解C语言面试题系列】013 以单词为单位的翻转字符串
**以单词为单位的翻转字符串**
**原题**:Write a function string reverse string word By word (String input) that reverses a string word by word.
For instance:
"The house is blue" --> "blue is house The"
"Zed is dead" -->"dead is Zed"
"All-in-one" -->"All-in-one"
在不增加任何辅助数组空间的情况下,对于这个问题我们可以采用的办法就是:
**办法一**:
1、翻转整个字符串。
2、翻转每一个单词。
**办法二**:
1、翻转每一个单词。
2、翻转整个字符串。
办法一和二其实就是一个顺序的问题,并不影响算法的时间或空间复杂度。
下面给出代码:【本程序在DEV C++ 4.9.9.2 下编译通过】
~~~
#include <stdio.h>
#define IS_PRINT(ch)( (ch) > 0x20 && (ch) < 0x7E ) // except space
char * ReverseEveryWord(char *str);
char * ReverseWholeString(char * str);
char * LR_Reverse(char *left,char *right);
int main(void)
{
char str[] = "Hello word! **";
char *p = str;
#if 0
ReverseWholeString(str);
ReverseEveryWord(str);
puts(str);
#else
ReverseEveryWord(str);
ReverseWholeString(str);
puts(str);
#endif
system("pause");
return 0;
}
char * ReverseEveryWord(char *str)
{
char *right = str,*left = str;
if(str == NULL)
return NULL;
while( !IS_PRINT(*right) )
right++;
while(*right)
{
left = right;
while(IS_PRINT(*right))
right++;
LR_Reverse(left,right-1);
while(*right && !IS_PRINT(*right))
right++;
}
return str;
}
char * ReverseWholeString(char * str)
{
char *p = str;
if(str == NULL)
return NULL;
while(*p) p++;
p--;
LR_Reverse(str,p);
return str;
}
char * LR_Reverse(char *left,char *right)
{
char tt,*ret = left;
if(left == NULL || right == NULL)
return NULL;
while(left < right)
{
tt = *left;
*left++ = *right;
*right-- = tt;
}
return ret;
}
~~~