题目内容:
编写一个函数reverse_string(char * str)
实现: 将参数字符串中的字符反向排列,不是逆序打印
要求: 不能使用C函数库中的字符串操作函数。
char[]=“abcdef”;
逆置后变成:fedcba
在这给大家提供两种方法,一种是递归的,一种是非递归的
一:非递归的
1.给两个指针,left放在左侧,right放在最后一个有效字符位置
2.交换两个指针位置上的字符
3.left指针往后走,right指针往前走,只要两个指针没有相遇,继续执行2步骤,两个指针相遇,循环结束.
具体的代码如下:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
void reverse_string1(char* arr)
{
int left = 0;
int len = strlen(arr);
int right = len - 1;
while (left < right)
{
char temp = arr[left];
arr[left] = arr[right];
arr[right] = temp;
left++;
right--;
}
}
int main()
{
char arr[] = "abcdef";
reverse_string1(arr);
printf("%s\n", arr);
system("pause");
return 0;
}
注意,这里求size不是使用sizeof去求的,使用strlen求的字符串长度
所谓的字符串是一种特殊的字符数组~~,
必须带有\0结尾的字符数组才是字符串.
strlen所求出来的长度是不包含\0的,
sizeof求出来的是包含\0的.
依题而论,我们要使用strlen,求出来的是6,才是我们要的长度,如果是sizeof,求出来的就是7,显然不符合.
二:递归
该有的解析我都在代码块里写着.
具体代码如下:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include<string.h>
void reverse_string2(char* arr)
{
//求长度
int len = strlen(arr);
if (len == 0||len == 1)
{
return;
}
//交换边缘的元素
char temp = arr[0];
arr[0] = arr[len - 1];
//这个操作是一个临时的操作,目的是为了让中间的"bcde"能够作为一个独立的字符串
arr[len - 1] = '\0';
//递归的来处理中间部分的字符串
//为了得到中间部分的字符串,需要做两件事
// arr+1,得到中间字符串的起始位置.
//还需要把刚才的len-1的位置设置为\0
//进行递归
reverse_string2(arr + 1);
//刚才是临时把len-1的位置设为\0了
//当递归结束的时候,还需要把len-1的值还原成合理的值
arr[len - 1] = temp;
}
int main()
{
char arr[] = "abcdef";
reverse_string2(arr);
printf("%s\n", arr);
system("pause");
return 0;
}
递归,举个例子,就是你拿着钥匙去开门,开了第一扇门,房间里还有一扇门,然后接着开门,开完以后进去房间里还有门,直到开到最后一扇门,拿到自己想要的东西,然后原路返回,先关最里面的门,依次关门,最后关你开启的第一扇门.