字符串反转问题

来源:互联网 发布:windows phone版qq下载 编辑:程序博客网 时间:2024/06/13 12:19

我的思路是,首先将这个字符串整个逆序,再将其中的每一个单词再次逆序,得到最终结果,刚开始没有思路的时候在纸上画画,有助于编程,这是我近期学习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;  }  
原创粉丝点击