在C中递归地反转一个字符串 - 仅使用指向字符串的指针

时间:2015-07-28 13:59:12

标签: c string pointers recursion

我正在尝试使用递归和指向该字符串的单个指针来反转字符串。

我的想法是从两个边缘遍历字符串,抬起指针并在字符串的末尾插入'\ 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;
}

3 个答案:

答案 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;。我希望这可以帮到你。