将获得的字符串逆序,总体思路为:
1.首元素取出,尾元素放到首元素位置。
2.将 '\0' 元素前移一位。
3.递归中间剩余元素。
例如,存在一个字符串 "abcdefg'\0'",先将a元素取出,将g元素前置,变为 "gbcdef '\0'",此时将'\0' 前移一位,占用g之前的位置,然后对中间剩余字符进行递归,执行以上步骤,直到中间剩余的元素小于等于1个。
不使用库函数的思路很简单,可以自己写一个获取字符串长度的函数来代替库函数strlen()。
整体代码如下:
#include<stdio.h>
#include<string.h>
int my_strlen(char * arr) //递归求字符串长度
{
int count = 0;
while (*arr != '\0') //循环直到字符串末尾找到 '\0'
{
count++; //计数器
arr++;
}
return count;
}
void reverse(char* arr) //字符串逆序,要求整个数组逆序,而不是逆序打印
{
char tmp = 0;
int len = 0;
tmp = *arr; //先取出第一个元素
len = my_strlen(arr); //求字符串的长度
*arr = *(arr + len - 1); //将最后一个元素放到第一位
*(arr + len - 1) = '\0'; //将最后一个元素改为 '\0'
if (my_strlen(arr + 1) > 1) //开始递归,判断条件是中间剩余的字符串小于等于1
reverse(arr + 1); //递归(每次递归都会执行上面的东西!也就是每次都会将
//最后一个元素放到第一位 然后最后一位改成 '\0',
//直到不满足循环条件)
*(arr + len -1) = tmp; //将开头取出的第一个元素放到最后
}
int main() //主函数
{
char arr[8] = { "abcdefg" };
reverse(arr);
printf("%s", arr);
}
这里还有一种方法是不考虑末尾的 \0 ,直接获取最左边元素位置(0)和
最右边元素位置(strlen(arr)-1),直接将这两个元素调换位置,然后递归中间的剩余元素,
递归和判断方法与这里的方法一致。