题目:编写一个函数 reverse_string(char * string),将参数字符串中的字符反向排列
思路:设置两个指针,分别指向字符串的头部和尾部,两两交换;然后另两个指针都向中间移动,每次移动都交换元素,直到指针相遇。图解如下:
代码:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<assert.h>
void reverse_string(char * string)
{
assert(string);
int left = 0;
int right = strlen(string) - 1;
while (left < right)
{
//交换字符
char tmp = string[left];
string[left] = string[right];
string[right] = tmp;
left++;
right--;
}
}
int main()
{
char p[] = "abcde";//注意这里不能写成char*p="abcde"的形式,因为这是一个常量字符串,不能被修改,所以执行到函数string[left] = string[right];语句会出错
reverse_string(p);
printf("%s", p);
system("pause");
return 0;
}
方法二:递归方式
代码:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<assert.h>
//递归翻转字符串
void reverse_string(char * string)
{
assert(string);
if (*string == '\0')
{
return;
}
else
{
int len = strlen(string);
char tmp = string[0];//将要交换的字符先保存起来,后面递归出来后按保存的顺序依次输出(类似于压栈退栈)
string[0] = string[len - 1];
string[len - 1] = '\0';//将最后一个字符不断置‘\0'缩小递归范围
reverse_string(string+1);
string[len - 1] = tmp;
}
}
int main()
{
char p[] = "abcde";//注意这里不能写成char*p="abcde"的形式,因为这是一个常量字符串,不能被修改,所以执行到函数string[left] = string[right];语句会出错
reverse_string(p);
printf("%s", p);
system("pause");
return 0;
}
测试结果: