我正在尝试使用递归和指向该字符串的单个指针来反转字符串。
我的想法是从两个边缘遍历字符串,抬起指针并在字符串的末尾插入'\ 0'。例如 - 给定一个字符串'abcde \ 0' - 在字符串中间替换“chars”,并在 - >之后插入'\ 0'。递归调用 - >当达到“停止条件”时,原始字符串应该是这样的 - 'edc \ 0 \ 0 \ 0' - 并且一半的字符存储为临时变量,在堆栈中。当返回并弹出堆栈时,这些字符应以相反的顺序覆盖'\ 0'。这就是主意。
到目前为止这是我的代码,但是我无法理解它 - 请帮助我理解,我会错过什么。我在字符串中间有一个'\ 0',我无法弄清楚如何重写它。 (我猜这是主要问题) 提前谢谢。
#include <stdio.h>
#include <string.h>
void rev_str(char* _str);
int main()
{
char str[]="abcde";
puts("Str before:");
puts(str);
rev_str(str);
puts("Str after");
puts(str);
return 0;
}
void rev_str(char* _str)
{
int len=strlen(_str);
char temp=*_str;
if(len>1)
{
*_str = _str[len-1];
_str[len-1]='\0';
rev_str(++_str);
}
_str[len-1]=temp;
}
答案 0 :(得分:0)
我不会调试你的代码,但这可能会帮助你更好地理解 -
http://www.programmingsimplified.com/c-program-reverse-string
从页面获取的示例 -
C程序使用指针反转字符串
现在我们将使用指针或不使用库函数strrev来反转字符串。
#include<stdio.h>
int string_length(char*);
void reverse(char*);
main()
{
char string[100];
printf("Enter a string\n");
gets(string);
reverse(string);
printf("Reverse of entered string is \"%s\".\n", string);
return 0;
}
void reverse(char *string)
{
int length, c;
char *begin, *end, temp;
length = string_length(string);
begin = string;
end = string;
for (c = 0; c < length - 1; c++)
end++;
for (c = 0; c < length/2; c++)
{
temp = *end;
*end = *begin;
*begin = temp;
begin++;
end--;
}
}
int string_length(char *pointer)
{
int c = 0;
while( *(pointer + c) != '\0' )
c++;
return c;
}
C程序使用递归来反转字符串
#include <stdio.h>
#include <string.h>
void reverse(char*, int, int);
int main()
{
char a[100];
gets(a);
reverse(a, 0, strlen(a)-1);
printf("%s\n",a);
return 0;
}
void reverse(char *x, int begin, int end)
{
char c;
if (begin >= end)
return;
c = *(x+begin);
*(x+begin) = *(x+end);
*(x+end) = c;
reverse(x, ++begin, --end);
}
答案 1 :(得分:0)
rev_str(++_str);
这就是问题所在。您在此处修改_str
,因此当您最后_str[len-1]=temp
时,您正在写入错误的位置。将其更改为
rev_str(_str + 1);
答案 2 :(得分:0)
只需将代码rev_str(++_str);
更改为rev_str(_str+1);
即可。 ++_str
等于_str += 1
,它会更改指针char *_str
。但_str+1
只会初始化formal param
,并且不会更改&#39; char * str&#39;。我希望这可以帮到你。