字符串逆序(递归实现)

字符串逆序(递归实现)
编写一个函数 reverse_string(char* string)(递归实现)
实现:将参数字符串中的字符反向排列,不是逆序打印。
要求:不能使用C函数库中的字符串操作函数。
比如 :
char arr[] = “abcdef”;
逆序之后数组的内容变成:fedcba
想法:在想递归之前,我们要先想常规方法要怎么做,首先编写函数求字符串的长度,然后让第一个元素和最后一个,第二个和倒数第二个交换,以此类推
代码:

#include

int Strlenth(char Str[]) {
	int count = 0;
	int i = 0;
	while (Str[i]!='\0')
	{
		count++;
		i++;
	}
	return count;
}

void reverse_string(char* string) {
	char tmp;
	int len = Strlenth(string);
	tmp = *string;
	*string = *(string + len - 1);
	*(string + len - 1) = '\0';
	if (Strlenth(string+1)>1)
	{
		reverse_string(string + 1);
	}
	*(string + len - 1) = tmp;
 //思考为什么以下写法结果会错误
	/*tmp = *string;
	*string = string[Strlenth(string) - 1];
	string[Strlenth(string) - 1] = '\0';

	if (Strlenth(string + 1) > 1)
	{
		reverse_string(string + 1);
	}
	string[Strlenth(string) - 1] = tmp;*/
}
int main(){
	char Str[] = { "abcdefg"};
	reverse_string(Str);
	printf("%s\n", Str);
	
	return 0;
}

遇到的问题:

    tmp = *string;
	*string = string[Strlenth(string) - 1];
	string[Strlenth(string) - 1] = '\0';

	if (Strlenth(string + 1) > 1)
	{
		reverse_string(string + 1);
	}
	string[Strlenth(string) - 1] = tmp;

为什么这种写法会出现错误?
因为上述两个语句
1.string[Strlenth(string) - 1] = ‘\0’;
2.string[Strlenth(string) - 1] = tmp;
在同一次调用的过程中,它们的string[Strlenth(string) - 1] 得到的值并不相同,有\0的阻挡,它的长度发生了变化。而第一种方法用的是地址,不受\0的影响
若想继续这样用需改为以下代码

tmp = *string;
	*string = string[Strlenth(string) - 1];
	string[Strlenth(string) - 1] = '\0';

	if (Strlenth(string + 1) > 1)
	{
		reverse_string(string + 1);
	}
	string[Strlenth(string)] = tmp;//修改了这句,使长度和原来相同

你可能感兴趣的:(C,算法,c语言)