user-0 提问: 现在边哭边看着这段代码，有大佬可以帮帮我吗？

回复:
user: user-1
content: 可以将字符串用空格拆分后放入一个vector,然后反向迭代，发现里面是空的就不打印，你自己加额外空格，搞定收工

user: user-2
content: 先不看代码了，给你提供一种解题思路吧： 1、按照空格将字符串拆分成若干份放到一个数组中， 2、将数组中自有空格的元素去掉， 3、将数组翻转， 4、合并数组重新生成字符串。

user: user-3
content: 这个问题的算法可以更简单一些。例如，对于串“abcd  efg hi”，可以进行以下三步： （1）将整个串反向，“ih gfe dcba” （2）按单词进行反向，“hi efg abcd” （3）按格式（单词间空一个空格）输出。 其中的串反向可以写成一个函数 char * reverseWords(char * s, int len);

user: user-4
content: 比如这样的字符串遍历“abcd efg”拆分成2个单词你会怎么做？很自然想到遍历字符串的字符，如果不是空格字符就一直追加到临时变量数组里，如果遇到空格，说明之前的临时变量数组的信息构成了一个单词，则把临时变量数组的信息作为一个单词保存。所以，两个if就是干这事的，第一个if判断是不是空格，不是空格则把字符追加到stack里，第二个if判断是空格，说明遇到了单词分割符，则把stack的信息保存到res里。 flag的作用就是判断有没有构成单词（即有没有不是空格的字符），如果构成单词（即flag==1），因为单词和单词之间要用空格分开，所以要追加一个空格；如果没有构成单词（即flag==0），比如连续读入多个空格字符”      ”，那么就没有必要追加空格。 最后while是判断有没有遇到非空格字符，比如“abc”这样的字符串，是不会进入if(s[i]==‘ ‘)的，这样进入if(s[i]!=‘ ‘)时保存到stack的信息就没有机会保存到res里，所以最后要做一次判断读入的数据是否有非空格的字符，如果有（即t>0)，则把stack的信息保存到res，比如“abc”这样的字符串，在for循环保存了stack=abc，for循环之外的最后的while才会把stack的信息保存到res 最后的if(t==0)是为了去掉多余的空格，比如上面分析if(flag==1)时，res追加了一个空格，假设这时候for循环刚好结束，那么res的最后是不是正好多了一个空格？所以要去掉这个多余的空格。怎么判断有没有多余的空格，就是最后的两个if(t==0)和if(count>0)，前者表示追加if(flag==1)追加空格后，没有再读到非空格字符（也就是没有再进入if(s[i]!=‘ ‘))，所以t为0；后者表示出现过单词（也就是进入过if(s[i]==‘ ‘)），否则count不会增加。

user: user-0
content: 引用 2 楼 user-5 的回复：执行一遍就很清楚了 #include <stdio.h> #include <stdlib.h> #include <string.h> char * reverseWords(char * s){     int len = strlen(s);     printf("len:%d\n",len);     if(len == 0)         return s;     char *res = (char *)malloc(sizeof(char) * (strlen(s) + 1));     //目测这里加1也行，用于句子末尾追加的\0作为结束符     char *stack = (char *)malloc(sizeof(char) * (strlen(s) + 1));     int i, t = 0;     int count = 0;     int flag = 0; 	 	//遍历一次整个句子，如果不是空格，进栈；如果是空格，出栈     for(i = len - 1;i >= 0;i--)     {         if(s[i] != ' ')         {             stack[t++] = s[i];             printf("stack[%d]:%c\n",t-1,s[i]);             flag = 1;         }         if(s[i] == ' ')              {             while(t > 0)             {                 res[count++] = stack[--t];                 printf("res[%d]:%c\n",t,res[count-1]);             }             if(flag == 1)             {                 res[count++] = ' ';                 printf("== res[%d]:%s\n",count-1,"加空格");             }             flag = 0;         }     } 	//用于处理特殊情况：输入的句子开头有空格     if(t == 0)     {         if(count > 0)         {             count--;         }     }     //用于处理特殊情况：输入的句子没有空格     while(t > 0)      {         res[count++] = stack[--t];     }     //句子末尾需要加\0作为结束     res[count] = '\0';     return res; } int main(void) {      char* ret = reverseWords("example"); 	printf("%s",ret); 	return 0; }最后面的两个特殊情况和t有什么关系？我想不明白

user: user-0
content: 引用 4 楼 weixin_45906870 的回复：[quote=引用 3 楼 qybao 的回复：]为什么+2？是为了数组不越界，其实+1就可以了。 至于思路，那就太简单了，字符串反过来遍历，遇到非空格则临时保存字符，遇到空格则把临时保存的字符反过来保存到最终结果 比如 hello world反过来遍历就是（从len-1倒着遍历） dlrow，临时保存到stack，然后遇到空格，把stack的信息反过来变成world保存到res，然后res加个空格 继续for循环遍历就是 olleh 临时保存到stack，然后for循环结束，代码继续执行到for后面的while t循环，把stack的信息反过来变成hello保存到res 最后res加上‘\0’字符串结束符 所以res最终就是world hello可以解释一下flag=1和flag=0的作用吗？[/quote]能解释一下最后面的while循环和两个人if循环吗？我没看懂

user: user-0
content: 引用 3 楼 qybao 的回复：为什么+2？是为了数组不越界，其实+1就可以了。 至于思路，那就太简单了，字符串反过来遍历，遇到非空格则临时保存字符，遇到空格则把临时保存的字符反过来保存到最终结果 比如 hello world反过来遍历就是（从len-1倒着遍历） dlrow，临时保存到stack，然后遇到空格，把stack的信息反过来变成world保存到res，然后res加个空格 继续for循环遍历就是 olleh 临时保存到stack，然后for循环结束，代码继续执行到for后面的while t循环，把stack的信息反过来变成hello保存到res 最后res加上‘\0’字符串结束符 所以res最终就是world hello可以解释一下flag=1和flag=0的作用吗？

user: user-4
content: 为什么+2？是为了数组不越界，其实+1就可以了。 至于思路，那就太简单了，字符串反过来遍历，遇到非空格则临时保存字符，遇到空格则把临时保存的字符反过来保存到最终结果 比如 hello world反过来遍历就是（从len-1倒着遍历） dlrow，临时保存到stack，然后遇到空格，把stack的信息反过来变成world保存到res，然后res加个空格 继续for循环遍历就是 olleh 临时保存到stack，然后for循环结束，代码继续执行到for后面的while t循环，把stack的信息反过来变成hello保存到res 最后res加上‘\0’字符串结束符 所以res最终就是world hello

user: user-5
content: 执行一遍就很清楚了 #include <stdio.h> #include <stdlib.h> #include <string.h> char * reverseWords(char * s){     int len = strlen(s);     printf("len:%d\n",len);     if(len == 0)         return s;     char *res = (char *)malloc(sizeof(char) * (strlen(s) + 1));     //目测这里加1也行，用于句子末尾追加的\0作为结束符     char *stack = (char *)malloc(sizeof(char) * (strlen(s) + 1));     int i, t = 0;     int count = 0;     int flag = 0; 	 	//遍历一次整个句子，如果不是空格，进栈；如果是空格，出栈     for(i = len - 1;i >= 0;i--)     {         if(s[i] != ' ')         {             stack[t++] = s[i];             printf("stack[%d]:%c\n",t-1,s[i]);             flag = 1;         }         if(s[i] == ' ')              {             while(t > 0)             {                 res[count++] = stack[--t];                 printf("res[%d]:%c\n",t,res[count-1]);             }             if(flag == 1)             {                 res[count++] = ' ';                 printf("== res[%d]:%s\n",count-1,"加空格");             }             flag = 0;         }     } 	//用于处理特殊情况：输入的句子开头有空格     if(t == 0)     {         if(count > 0)         {             count--;         }     }     //用于处理特殊情况：输入的句子没有空格     while(t > 0)      {         res[count++] = stack[--t];     }     //句子末尾需要加\0作为结束     res[count] = '\0';     return res; } int main(void) {      char* ret = reverseWords("example"); 	printf("%s",ret); 	return 0; }

user: user-5
content: 哪看不明白，那就加上打印看程序是怎么执行的