簡體   English   中英

在 C 中遞歸反轉字符串 - 僅使用指向字符串的指針

[英]Reverse a string recursively in C - using a pointer to string only

我正在嘗試使用遞歸和指向該字符串的單個指針來反轉字符串。

我的想法是從兩端遍歷字符串,提高指針並在字符串的末尾插入 '\\0's。 例如 - 給定一個字符串 '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;
}

我不會調試你的代碼,但這可能會幫助你更好地理解——

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);
}
    rev_str(++_str);

這就是問題。 您正在此處修改_str ,因此當您在最后執行_str[len-1]=temp時,您正在寫入錯誤的位置。 將其更改為

    rev_str(_str + 1);

只需更改代碼rev_str(++_str); 進入rev_str(_str+1); . ++_str等於_str += 1 ,它會改變指針char *_str 但是_str+1只會初始化formal param ,不會改變 'char *str'。 我希望這可以幫助你。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM