## 【我解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;
}
~~~