//題目要求要求:不能使用C函數庫中的字元串操作函數
(否則本題也沒什麼意義了啊)
<1>非遞歸方法
此方法基本思想是設立兩個指針,分别指向字元串的頭尾
并且依次交換所指向的資料,代碼中為left和right
源代碼:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>//因為要使用strlen()語句
void reverse_string(char str[])
{
int temp;
char *left = str;
char *right = str + strlen(str) - 1;
while (*left <* right)
{
temp = *left;
*left = *right;
*right = temp;
*right--;
*left++;
}
}
int main()
{
char str[] = "chooseyou";
printf("%s\n", str);
reverse_string(str);
printf("%s", str);
system("pause");
return 0;
}
<2>遞歸方法
遞歸方法思想如下圖
類似于非遞歸的left與right指針所指資料互換
遞歸時隻訂立一個指針,每一次通過未交換字元串的長度(len)來表示所指向的元素的字元串倒數除\0外第一個元素。
每一次的遞歸将指針所指的元素儲存進一個變量,并且将倒數第一個元素(除\0外),與所知元素換再把最後元素置為\0,然後改變len進行下次遞歸。
最後的效果是字元串由長變短再變長得以完成反向排列
詳解如圖
#include<stdio.h>
#include<stdlib.h>
void reverse_string(char *str)
{
int len = strlen(str);
char temp=*str;//目前所指元素
*str = *(str + len - 1);//除\0外最後一個元素
*(str + len - 1) = '\0';//置\0
if (strlen(str + 1) >= 2)//長度小于等于1則不需要交換
{
reverse_string(str + 1);
}
*(str + len - 1) = temp;//将儲存的元素反序序放回字元串完成反向排序
}
int main()
{
char str[] = "chooseyou";
printf("%s\n", str);
reverse_string(str);
printf("%s\n", str);
system("pause");
return 0;
}