天天看點

遞歸實作 參數字元串中的字元反向排列

編寫一個函數reverse_string(char * string)(遞歸實作)

實作:将參數字元串中的字元反向排列。

要求:不能使用C函數庫中的字元串操作函數。

如果原字元串是"abcdef",将它用遞歸的方式翻轉成"fedcba";

則原數組記憶體的是  "abcdef\0"

調用函數:先将字元a儲存起來,将f換到a的位置,再将原f的位置置為"\0"

調用函數:指針向前走一個位置,傳給函數的參數字元串變為"bcde\0"

再将字元b儲存起來,将e換到b的位置,再将原e的位置置為"\0"

調用函數:指針向前再走一個位置,傳給函數的參數字元串變為"cd\0"

再将字元c儲存起來,将d換到c的位置,再将原d的位置置為"\0"

字元串變為"d\0";

然後 ,

退出一次函數調用,将儲存起來的c放到"\0"的位置,參數字元串變為"dc\0"

退出一次函數調用,再将儲存起來的b放到"\0"的位置,參數字元串變為"edcb\0"

退出一次函數調用,再将儲存起來的a放到"\0"的位置,參數字元串變為"fedcba\0"

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<assert.h>
char reverse_string(char * string)
{
	assert(string);
	int len = strlen(string) - 1;
	char tmp;
	if (len > 0)
	{
		// 指針形式
		tmp = *string;
		*string = *(string + len);
		*(string + len) = '\0';
		reverse_string(string + 1);
		*(string + len) = tmp;

		// 數組下标形式
		/*tmp = string[0];
		string[0] = string[len];
		string[len] = '\0';
		reverse_string(string + 1);
		string[len] = tmp;*/
	}
	return string;
}
int main()
{
	char arr[] = {0};
	scanf("%s", arr);
	printf("原字元串是:>  %s\n",arr);
	reverse_string(arr);
	printf("翻轉後的字元串是:>%s\n",arr );
	system("pause");
	return 0;
}