013 以单词为单位的翻转字符串

最后更新于:2022-04-01 14:40:32

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