给定字符串,使用自定义函数实现字符串的逆置算法。
首先我们先使用普通的算法进行实现:
void reverse_string(char* str,int n)
{
int left = 0;
int right = n - 1;
//int right = strlen(str)-1;
while (left < right)
{
char tmp = *(str + left);
*(str + left) = *(str + n - 1);
*(str + n - 1) = tmp;
left++;
right--;
}
}
int main()
{
char arr[10] = "abcdef";
int len = strlen(arr);
reverse_string(arr,len);
for (int i = 0; i < len; i++)
{
printf("%c", arr[i]);
}
return 0;
}
递归实现:
我们最初的思想如下:
❗但是在这个过程中我们会发现一个问题:
字符串内部应该是这样的:
当我们在进行最初思想的操作时,我们逆置a和f后,字符串变成fbcdea,问题就出现在这个地方,如果我们再进行reverse_string(bcde)时,e后是a而不是'\0',所以在这种问题之下,我们对解决方法进行了改良。
改良办法如下:
此处递归的限制条件是,当逆置的字符个数超过2个时,执行递归,否则递归终止。
代码实现:
#include <string.h>
void reverse_string(char* str)
{
int len = strlen(str);
char tmp = *str;
*str = *(str + len - 1);
*(str + len- 1) = '\0';
if (strlen(str + 1) > 2)
reverse_string(str + 1);
*(str + len - 1) = tmp;
}
int main()
{
char arr[10] = "abcdef";
int len = strlen(arr);
reverse_string(arr);
for (int i = 0; i < len; i++)
{
printf("%c", arr[i]);
}
return 0;
}