59. 分别用迭代与递归来实现逆置字符串。同时练习递归逆序时保存数据。

 

 

//用迭代实现

 1 //实现字符串逆置
 2 #include <stdio.h>
 3 #include <string.h>
 4 
 5 void reverseStr(char * str)
 6 {
 7     char* right = str + strlen(str) - 1;
 8     char* left = str;
 9     while(left<right)
10     {
11         *left ^= *right;
12         *right ^= *left;
13         *left ^= *right;
14         left++;
15         right--;
16     }
17 }
18 
19 
20 
21 
22 
23 int main(void)
24 {
25     char str[] = "123";
26 
27     reverseStr(str);
28 
29     char* p = str;
30     while(*p)
31     {
32         printf("%c",*p);
33         p++;
34     }
35 
36 
37     return 0;
38 }

 

 

 

//用递归实现,学会实现递归逆序时保存数据。

 

使用全局buffer版

 1 //使用全局buffer版
 2 #include <stdio.h>
 3 #include <string.h>
 4 
 5 char buffer[1024];
 6 char* buf = buffer;
 7 void reverseStr(char * str)
 8 {
 9     if(*str)
10     {
11          reverseStr(str+1);
12          *buf++ = *str;
13     }
14 }
15 
16 int main()
17 {
18     char str[] = "123";
19     reverseStr(str);
20 
21     char* p = buffer;
22     while(*p)
23     {
24         printf("%c",*p);
25         p++;
26     }
27     return 0;
28 }

 

 

使用局部buffer版。

  1 //使用局部buffer版
  2 #include <stdio.h>
  3 #include <string.h>
  4 
  5 //错误   每次调用均是给buf第一个元素赋值
  6 void reverseStr1(char * str,char* buf)
  7 {
  8     if(*str)
  9     {
 10         reverseStr1(str+1,buf);
 11         *buf++ = *str;
 12     }
 13 }
 14 
 15 
 16 
 17 //错误   拿最后一个填最后一个,最后存完仍是正序
 18 void reverseStr2(char * str,char* buf)
 19 {
 20     if(*str)
 21     {
 22         reverseStr2(str+1,buf+1);
 23         *buf = *str;
 24     }
 25 }
 26 
 27 
 28 
 29 //正确,拿str最后一个填给buff第一个上,最后存完是逆序。但是不推荐这样用,调用传递参数时太麻烦。
 30 void reverseStr3(char * str,char* buf)
 31 {
 32     if(*str)
 33     {
 34         reverseStr3(str+1,buf-1);
 35 
 36         *buf = *str;
 37     }
 38 }
 39 
 40 //正确  ,推荐,使用strncat,去除了移动buf的麻烦,最好的实现
 41 void reverseStr4(char * str,char* buf)
 42 {
 43     if(*str)
 44     {
 45         reverseStr4(str+1,buf);
 46 
 47         strncat(buf,str,1);
 48     }
 49 }
 50 
 51 //正确 ,喜欢这个思路,在递归函数中用下静态变量,对递归的同时同步保存数据好用。
 52 void reverseStr5_1(char * str,char* buf)//思路对,用法错
 53 {
 54     static char* sbuf = buf;//定义静态变量必须使用常量初始化,这里报错
 55     if(*str)
 56     {
 57         reverseStr5_1(str+1,buf);
 58          *sbuf++ = *str;
 59     }
 60 
 61 }
 62 //正确
 63 void reverseStr5_2(char * str,char* buf)//思路对,用法对
 64 {
 65     static int i = 0;//定义静态变量必须使用常量初始化
 66     if(*str)
 67     {
 68         reverseStr5_2(str+1,buf);
 69         *(buf + (i++)) = *str;
 70     }
 71 }
 72 
 73 int main()
 74 {
 75 #if 0  //1错误,要明白为何错误,体会过程
 76     char str[] = "123456789";
 77     char buffer[1024] = {0};
 78     reverseStr1(str,buffer);
 79     //...
 80 #endif
 81 
 82 
 83 
 84 #if 0   //2错误,要明白为何错误,体会过程
 85     char str[] = "123456789";
 86     char buffer[1024] = {0};
 87     reverseStr2(str,buffer);
 88     //...
 89 #endif
 90 
 91 
 92 #if 0   //3正确
 93     char str[] = "123456789";
 94     int bufLen = strlen(str)+1;
 95     char buffer[bufLen];//变长数组定义时不能初始化,也可以考虑用堆空间
 96     reverseStr3(str,buffer+bufLen-2);//传入buffer从倒数第二个位置,最后一个位置用来存\0
 97     buffer[bufLen-1] = '\0';
 98 #endif
 99 
100 #if 0 //4正确
101     char str[] = "123456789";
102     char buffer[1024] = {0};
103     reverseStr4(str,buffer);
104     buffer[strlen(str)] = '\0';
105 #endif
106 
107 
108 #if 1//5_2正确
109     char str[] = "123456789";
110     char buffer[1024] = {0};
111     reverseStr5_2(str,buffer);
112     buffer[strlen(str)] = '\0';
113 #endif
114 
115 
116 
117     char* p = buffer;
118     while(*p)
119     {
120         printf("%c",*p);
121         p++;
122     }
123     return 0;
124 }
 

posted @ 2018-08-29 17:50  2018年8月10日注册  阅读(315)  评论(0编辑  收藏  举报