我的思路是,首先将这个字符串整个逆序,再将其中的每一个单词再次逆序,得到最终结果,刚开始没有思路的时候在纸上画画,有助于编程,这是我近期学习C语言的心得。
接下来我们来编程解决这个问题。

#include <stdio.h>
#include <assert.h>
int my_strlen(const char *str)//求字符串长度函数
{
    int count = 0;
    assert(str);
    while(*str != '\0')
    {

        count++;
        str++;
    }
    return count;


}
void reverse(char a[],int left,int right)//逆序函数
{
    while(left<right)
    {
        char tmp=a[left];
        a[left]=a[right];
        a[right]=tmp;
        left++;
        right--;
    }

}
char* reverse_string(char a[])//逆序字符串
{
    int i = 0;
    int left = 0;
    int right = my_strlen(a)-1;//逆序整个字符串
    reverse(a,left,right);
    //逆序逐个单词
    while(a[i]!='\0')
    {
        left = i;
        while((a[i]!='\0')&&(a[i]!=' '))
        {
            i++;

        }
        right=i-1;
        reverse(a,left,right);
        if(a[i]!='\0')
            i++;
    }
    return a;
}

int main()
{
    char a[]="student a am i";
    reverse_string(a);
    printf("%s\n",a);
    return 0;
}

普通字符串反转:
方法一,用while循环交换首尾。

#define _CRT_SECURE_NO_WARNINGS 1  
#include<stdio.h>  
#include<stdlib.h>  
#include<assert.h>  

char *reverse(char *start,char *end)//翻转字符串  
{  
   char *ret=start;  
   assert(start);  
   assert(end);  
   while(start<end)  
   {  
      char tmp=*start;  
      *start=*end;  
      *end=tmp;  
      start++;  
      end--;  
   }  
   return ret;  
}  

int main()  
{  
   char arr[]="tneduts a ma i";  
   int sz=sizeof(arr)/sizeof(arr[0])-1;//减去‘\0’  
   char *ret=reverse(arr,arr+sz-1);  
   printf("%s\n",ret);  
   system("pause");  
   return 0;  
}

方法二:
函数递归调用

问题描述:
编写一个函数reverse_string(char *srring)(递归实现)
实现:将参数字符串中的字符反向排列。
要求:不能使用处C库函数中的字符串操作函数。
程序分析:
思路如下:
本程序用递归的思想实现这一功能,最关键的一点是要改变’\0’所在的位置。a.先交换字符串最外层的两个字符,同时保存第一个字符的值(称之为压栈) b.将指针指向下一个字符,将两个值交换后的最后一个字符赋为’\0’,从而减小问题的规模。c.递归调用,相当于传入新的字符串。d.递归调用结束后,把之前保存的值又返回到相应的字符串的位置。

#include<stdio.h>  

/*******递归的方式写字符串长度函数*******/  
int my_strlen(char *str)    
{  
    if(*str == '\0')    //当传入的字符串中没有字符  
        return 0;       //字符串长度为0  
    else  
        return 1+ my_strlen(str+1); /*运用递归,每递归一次 
    长度加1,直到遍历到的'\0'时结束递归*/  
}   
/*******递归方式写字符串反转*******/  
void reverse_string(char *string)  
{  
    int len = my_strlen(string);//调用上面的字符串长度函数;  
    if(len <= 1) //当字符串长度小于等于1时,不执行;  
        return ;  
    else  
    {  
        char temp = string[0];   //将第一个字符的值保存在temp中;  
        string[0] = string[len-1];//将最后一个字符赋给第一个字符;  
        string[len-1] = '\0';   //将最后一个字符的内容赋为'\0';  
        reverse_string(string+1);//递归调用下一次反转;  
        string[len-1] = temp;   //将temp赋给当前的最后一个字符;  
    }  
}  

int main()  
{  
    char ch[] = "abcdefghijklmno";  
    reverse_string(ch);  
    printf("%s ",ch);  
    printf("\n");  
    getchar();  //缓冲;  
    return 0;  
}