将一句话的单词进行倒置,标点不倒置。比如 "I like beijing.",经过处理后变为:"beijing. like I"。 
   字符串长度不超过100。 
                                        输入一个仅包含小写字母、空格、'.' 的字符串,长度不超过100。'.' 只出现在最后一个单词的末尾。
依次输出倒置之后的字符串,以空格分割。
I like beijing.
beijing. like I
#include<stdio.h>
void reserve()
{
    char arr[100];
    if ((scanf("%s",arr))!=EOF)
    {
        reserve();
        printf("%s ",arr);
    }
}
int main()
{
    reserve();
    return 0;
} 使用递归函数 从后往前打印#include <stdio.h>
#include<assert.h>
void reverse(char*left,char*right)
{
    assert(left);
    assert(right);
    while(left<right)
    {
        char tmp = *left;
        *left = *right;
        *right = tmp;
        left++;
        right--;
    }
}
int main() {
    char arr[101] = {0};
    gets(arr);
    int len = strlen(arr);
    reverse(arr,arr+len-1);
    char*start=arr;
    while(*start)
    {
        char*end=start;
        while(*end != ' ' && *end != '\0')
        {
            end++;
        }
        reverse(start,end-1);
        if(*end != '\0')
        end++;
        start = end;
    }
    printf("%s\n",arr);
    return 0;
}
 用C语言解出,思路是先整体反转,在进行每个单词的反转,用句号和空格判断单词。
                                                                                    #include <stdio.h>
int main() {
    char input[100];
    gets(input);
    int index = 0;
    char str[100][100] = {0};
    int x = 0,y = 0;
    while(input[index] != '\0'){
        if(input[index] == ' '){
            y = 0;
            x++;
        }else {
            str[x][y] = input[index];
            y++;
        }
        index++;
    }
    index = 0;
    for(int i = x; i >= 0; i--){
        index = 0;
        while(str[i][index] != '\0'){
            printf("%c",str[i][index]);
            index++;
        }
        printf(" ");
    }
}
 #include <stdio.h>
#include <assert.h>
#include <string.h>
void Reverse_arr(char* left, char* right) {
    assert(left);
    assert(right);
    char tem = 0;
    while (left < right) {
        tem = *left;
        *left = *right;
        *right = tem;
        left++;
        right--;
    }
}
int main() {
    char arr[101] = { 0 };
    int len = 0;
    char* left = NULL;
    char* right = NULL;
    //读取
    gets(arr);
    len = strlen(arr);
    right = &arr[len - 1];
    left = &arr[0];
    //逆序整个句子
    Reverse_arr(left, right);
    //逆序每一个单词
    while (*right != '\0') {
        right = left;
        //right在正常情况下,遇到空格就可以判断单词结束,进行逆序单词操作了
        //但还有一种特殊情况:单词在句子的末尾。
        //此时right指向的不是空格,而是'\0'
        //所以要把这2种情况都加上
        while (*right != ' ' && *right != '\0') {
            right++;
        }
        //此时right指向空格,所以要自减1再传入逆序函数
        Reverse_arr(left, right - 1);
        left = right + 1;
    }
    //输出
    printf("%s\n", arr);
    return 0;
} #include <stdio.h>
#include<string.h>
void revers(char* left, char *right)
{
    while (left < right)
    {
        char a = *left;
        *left = *right;
        *right = a;
        left++;
        right--;
    }
}
int main()
{
    char arr[101];
    gets(arr);
    int a = strlen(arr);
    revers(arr, arr + a - 1);
    char* start = arr;
    char* end = arr;
    while(*start)
    {
        while (*end != ' ' && *end != '\0')
        {
            end++;
        }
        revers(start, end - 1);
        if (*end)
        {
            end++;
        }
        start = end;
    }
    printf("%s\n", arr);
    return 0;
} #include <iostream>
#include<string>
#include<algorithm>
using namespace std;
int main() {
    string s1;
    getline(cin,s1);
//先整体逆置
    reverse(s1.begin(),s1.end());
//再以空格划分区间进行分段逆置回来
    //在先逆序之后最后加入有空格,防止最后一个单词找不到的情况
    s1+=" ";
    auto it=s1.begin();
    auto back= find(s1.begin(),s1.end(),' ');
    while(back!=s1.end())
    {
        reverse(it,back);
        it=back+1;
        back=find(it,s1.end(),' ');
    }
    for(auto x:s1)
    {
    cout<<x;
    }
} //从最后一个字符开始往前找空格,遇到空格就置为'\0', //然后从'\0'的下一个字符开始打印,得到一个单词#include<stdio.h> int main() { char arr[100] = { 0 }; while (gets(arr)) { int right = strlen(arr) - 1;//right是指字符串中最后一个字符的下标 arr[right + 1] = '\0';//最后一个字符的下一个元素置为'\0',方便一会打印 while (right >= 0)//当下标小于0停止循环 { if (arr[right] == ' ')//从最后一个字符元素开始往前找,当数组元素是空格时,说明这往后是一个单词 { printf("%s ", &arr[right + 1]);//空格下一个元素开始打印该单词 arr[right] = '\0';//把空格置为'\0',方便打印下一个单词 } else if (right == 0)//说明遇到了最前面的单词了 { printf("%s", &arr[right]); } right--;//下标不断递减 } printf("\n"); } return 0; }
#include <stdio.h>
void reverse(char* left, char* right) {
    while (left < right) {
        char tmp = *left;
        *left = *right;
        *right = tmp;
        left++;
        right--;
    }
}
int main() {
    char arr[101] = {0};
    gets(arr);
    int len = strlen(arr);
    //1.逆序整个字符串
    reverse(arr, arr + len - 1);
    //2.逆序单词
    char* start = arr;
    while (*start) {
        char* end = start;
        while (*end != ' '&&*end!='\0') {
            end++;
        }
        reverse(start, end - 1);
        if(*end!='\0')
        end++;
        start = end;
    }
    printf("%s", arr);
    return 0;
}