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从倒数第二个位置,最后一个位置用来存 97 buffer[bufLen-1] = '