假设有一组字符数组char ch[] = "abcdefgh";那么我们怎么不借助C的库函数来实现倒序打印hgfedcba呢?
我们先来介绍一下使用非递归的方式:
我们可以先将首元素和末尾元素进行一个交换,然后再将第二个元素和倒数第二个元素进行交换,以此类推,直到交换完所有的元素之后停止,无论数组元素是偶数个还是奇数个,对我们都没有影响,偶数个的时候每个元素都会参与交换,奇数个的时候(abc)中间的那个元素即使可以不参与交换也是没影响的(cba)!
偶数个:
奇数个:
那个接下来我们就是写代码了
#include <stdio.h>
#include <string.h>
void reverse_string(char ch[], int sz)
{
//参考二分查找的思想去实现字符的颠倒
int left = 0;//左下标
int right = sz - 1;//右下标
while (left < right)
{
int ret = 0;
ret = ch[left];
ch[left] = ch[right];
ch[right] = ret;
left++;
right--;
}
}
int main()
{
char ch[] = "abcdef";
int sz = strlen(ch);//只是用来算一下字符数组的大小,逆序在函数中实现
reverse_string(ch, sz);
int i = 0;
for (i = 0; i < sz; i++)
{
printf("%c", ch[i]);
}
return 0;
}
递归方法的基本思路也是这个 ,只不过还是要注意一下递归结束条件
#include <stdio.h>
#include <string.h>
void reverse_string1(char ch[], int left, int right)
{
if (left < right)
{
int ret = 0;
ret = ch[left];
ch[left] = ch[right];
ch[right] = ret;
left++;
right--;
reverse_string1(ch, left, right);
}
}
int main()
{
char ch[] = "abcdef";
int sz = strlen(ch);//只是用来算一下字符数组的大小,逆序在函数中实现
//使用递归的时候要注意一下,下标的定义不能写在函数里,那样每次递归的时候,下标的值都会被重置
int left = 0;//左下标
int right = sz - 1;//右下标
reverse_string1(ch, left, right);
int i = 0;
for (i = 0; i < sz; i++)
{
printf("%c", ch[i]);
}
return 0;
}