字符串逆序实现方法
- 1. 借助额外数组
- 2. 循环实现
- 2.1 图解
- 2.2 思路
- 2.3 代码实现
- 3. 递归实现1
- 4. 递归实现2
- 4.1 思路
对字符串进行逆序,以字符串abcdef为例
1. 借助额外数组
#include <stdio.h>
#include <string.h>int main() {char str[] = "abcdef";//求字符串的大小,包括'\0'在内int sz = strlen(str) + 1;//动态内存分配,申请一个大小为sz的字符数组char* p = (char*)malloc(sizeof(char) * sz);int i = 0;int j = 0;for (i = 0, j = sz - 2; j >= 0; i++, j--) {p[i] = str[j];}//为申请的字符数组添上字符'\0'p[i] = '\0';//拷贝回strcpy(str, p);printf("%s\n", str);return 0;
}
2. 循环实现
2.1 图解

2.2 思路
字符串可以理解为末尾带
'\0的字符数组,可以通过数组下标访问字符串的单个字符。
- 对字符串的逆序不包括其末尾的
'\0- 一种方法是让处
'\0'之外的字符中第一个与最后一个交换,第二个与倒数第二个字符交换,直到完成所有对称的字符的交换。- 定义两个变量:
left记录数组做下标,从0开始;right记录数组右下标,从字符串长度-1开始。- 每次交换后
left+1,right-1。- 循环交换结束条件:
left大于等于right时结束循环。
2.3 代码实现
#include <stdio.h>
#include <stdio.h>void reverse_str(char* str, int left, int right);int main() {char str[] = "abcdef";int left = 0;int right = strlen(str) - 1;reverse_str(str, left, right);puts(str);return 0;
}
//
void reverse_str(char* str, int left, int right) {while (left < right) {char t = str[left];str[left] = str[right];str[right] = t;left++;right--;}
}
3. 递归实现1
思路:与循环实现的思路基本相同,只是实现方式通过函数自身调用自身实现。
//递归实现
#include <stdio.h>void reverse_str(char* str, int left, int right);
int my_strlen(char* str);int main() {char str[] = "abcdef";int left = 0;int right = my_strlen(str) - 1;reverse_str(str, left, right);printf("%s\n", str);return 0;
}
//逆序字符串
void reverse_str(char* str, int left, int right) {if (left < right) {char t = str[left];str[left] = str[right];str[right] = t;reverse_str(str, left + 1, right - 1);}
}
//求字符串长度
int my_strlen(char* str) {if (*str != '\0') {return 1 + my_strlen(str+1);}else {return 0;}
}
4. 递归实现2
4.1 思路
递归思想 - 把大的问题逐步缩小为小的问题。
- 如字符串
abcdef- 逆序字符串
abcdef
- 要逆序字符串
abcdef,即是逆序a与f加上字符串bcde。- 若出现字符串
bcde则f位置必须先赋值为'\0'。- 就是说逆序
a与f时,f位置不能立马储存字符a,等到字符串bcde逆序完成之后f位置再储存a,故a需要先用临时字符变量t存放;而对字符a的位置没有限制,故字符a的位置可以直接存放字符b的值。
- 逆序字符串
bcde
- 要逆序字符串
bcde,即是逆序b与c加上字符串cd。
- 字符串
cd逆序- 停止逆序
- 函数进行回调,完成全部逆序
这种思路不太好想,加油!
#include <stdio.h>void reverse_string(char* string);
int my_strlen(char* str);int main() {char str[20] = "abcdef";reverse_string(str);puts(str);return 0;
}
//字符串逆序
void reverse_string(char* string) {char t = *string;int len = my_strlen(string);*string = *(string + len - 1);*(string + len - 1) = '\0';if (my_strlen(string+1) >=2) {reverse_string(string + 1);}*(string + len - 1) = t;
}//求字符串长度
int my_strlen(char* str) {if (*str != '\0') {return 1 + my_strlen(str + 1);}else {return 0;}
}
END



















