题目 :写一个函数实现将字符数组中的字符反向排列
char arr[] = "abcdef";
经过函数 reverse_string 将字符数组变成
char arr[] = "fedcba";
思路
1、创建变量 left 和 right 作为字符串的下标进行逆序
reverse_string 函数名,让 left 指向字符串的第一的元素,right 指向最后一个元素,将它们两个元素交换,重复进行该操作,知道 left 和 right 中间元素小于等于一(如果有一个元素就可以不用再交换了)
void reverse_string(char s[])
{
int len = strlen(s);
int left = 0;
int right = len - 1;//这里由于下标是从 0 开始的所以要减一
char tmp = NULL;//临时变量 方便交换元素
while (left < right)
{
tmp = s[left];
s[left] = s[right];
s[right] = tmp;
left++;
right--;
}
}
注:当 left 等于 right 或 left 大于 right 时不能再交换了
2、可以用递归思想来实现
用递归可以用指针变量(char* arr)来指向所需要交换的元素
arr指向首元素地址 arr + len - 1指向最后一个元素,将两个元素交换,交换后将arr+1指向下一个元素,将 arr +len - 1指向的元素变成 NULL ,便于直接求出下一个字符串长度 len 实现递归
void reverse_string(char* arr)
{
int len = strlen(arr);
char tmp = *arr;
*arr = *(arr - 1 + len);
*(arr - 1 + len) = NULL;
if (strlen(arr + 1) >= 2)
reverse_string(arr + 1);
*(arr - 1 + len) = tmp;
}
递归思想
先将字符 a 和 f 交换
再逆序中间的 bcde
将字符 b 和 e 交换
再逆序中间的cd
当中间的元素小于或等于一时不用在交换了
原题
#include<stdio.h>
int my_strlen(char* arr)
{
if (*arr != '\0')
return 1 + my_strlen(arr + 1);
else
return 0;
}
void reverse_string(char* arr)
{
int len = my_strlen(arr);
char tmp = *arr;
*arr = *(arr - 1 + len);
*(arr - 1 + len) = NULL;
if (my_strlen(arr + 1 ) >= 2)
reverse_string(arr + 1);
*(arr - 1 + len) = tmp;
}
int main()
{
char arr[] = "abcdefg";
reverse_string(arr);
printf("%s", arr);
return 0;
}
用递归思想和迭代差不多
这里给大家道个歉 char 类型的变量初始化成 NULL 虽然值和初始化为 0 的值一样,但 NULL 一般来说是初始化指针变量的,这里不应该用来初始化 char 类型变量