目录
1.常规做法(strlen的返回值是size_t,也可以用int接收)
补充方法(来自http://t.csdn.cn/1Dv0F)
一、逆序打印和反向排列的区别
逆序打印:将数组内部的所有元素进行反向输出,而数组本身内部元素顺序并未发生改变。
反向排列:将原来的数组内部的所有元素重新排列为逆序。
二、逆序打印(递归)
#include<stdio.h>
void reverse_string(char* string)
{
if (*string )//当指针string指向'\0'时,不再递归
{
reverse_string(string+1);
printf("%c", *string );
}
}
int main()
{
char arr [] = "abcdef";
reverse_string(arr);
return 0;
}
三、反向排列
1.常规做法(strlen的返回值是size_t,也可以用int接收)
#include<stdio.h>
#include<string.h>
void reverse_string(char* string)
{
size_t len = strlen(string);
size_t left = 0;
size_t right = len - 1;
while (left < right)
{
char tmp = string[left];
string[left] = string[right];
string[right] = tmp;
left++;
right--;
}
}
int main()
{
char arr [] = "abcdef";
reverse_string(arr);
printf("%s\n",arr);
return 0;
}
2.递归解法(也是本文重点)
先将 a 放到临时变量中。再把f移到原来a的位置,原来 f 的位置放入'\0'。(用于结束递归)之后下一轮递归。判断是否递归后面把临时变量的字符放回去。
代码如下:strlen(string + 1) > 1 是因为字符是奇数的情况strlen(string + 1) ==1 ,偶数如上述例子strlen(string + 1) == 0。
#include<stdio.h>
#include<string.h>
void reverse_string(char* string)
{
size_t len = strlen(string);
char tmp = string[0];
string[0] = string[len - 1];
string[len - 1] = '\0';
if (strlen(string + 1) > 1)
reverse_string(string + 1);
string[len - 1] = tmp;
}
int main()
{
char arr [] = "abcdef";
reverse_string(arr);
printf("%s\n",arr);
return 0;
}
突然想到前面的常规做法也可以递归
代码如下:
#include<stdio.h>
#include<string.h>
void reverse_string(char* string,int left,int right)
{
if (left < right)
{
char tmp = string[left];
string[left] = string[right];
string[right] = tmp;
reverse_string(string, left + 1, right - 1);
}
}
int main()
{
char arr[] = "abcdef";
reverse_string(arr,0,strlen(arr)-1);
printf("%s\n", arr);
return 0;
}
3.补充方法(来自http://t.csdn.cn/1Dv0F)
顺带一提,隔了一行是因为把\n也打印出来了。
#include<stdio.h>
void reverse()
{
int input;
input = getchar();//getchar返回值是int
if (input != '\n')
reverse();
printf("%c", input);
}
int main()
{
printf("请输入字符串,以回车结束 :\n");
reverse();
return 0;
}