【问题标题】:How to use a recursive char * function to reverse a string in C++如何使用递归 char * 函数在 C++ 中反转字符串
【发布时间】:2016-01-25 08:12:01
【问题描述】:

为了全面披露,这是一项家庭作业。

我需要使用仅接受“char *string”输入的递归函数来反转 char 字符串

我已经做了很多谷歌搜索等等,但似乎无法弄清楚。如果我可以使用 void 函数,这将在几个小时前完成,但可惜,这是不允许的。

以下代码不返回任何内容,我们也不允许更改函数签名

char *reverseString(char *string)
{

    if (*string =='\0') return string;

    else
    {
        return reverseString(string + 1) + *string;
    }

}

这是我多次尝试从 main 调用此函数以从中获取输出,虽然代码运行,但我在控制台中没有得到任何输出

char Tstring[] = "TestString";
cout << reverseString(Tstring);
cout << *reverseString(Tstring);
char *answer2 = reverseString(Tstring);
cout << *answer2;

我显然不是在寻求直接的解决方案,但是我很难理解如何使用指针作为输入等等来做到这一点。任何正确方向的提示或轻推表示赞赏

【问题讨论】:

  • “写void函数”,然后改成返回“char *”并返回输入。
  • 你不能使用其他功能来做这项工作吗?
  • char* 字符串不与+ 运算符连接。
  • Modify const char * in C的可能重复
  • 您的递归适用于真正的字符串对象,但不适用于char*。您需要使用不同的递归,即字符的就地交换。

标签: c++ recursion


【解决方案1】:

我认为这段代码会起作用。抱歉写了这么一个基本的。我只是在学习 C++。

#include<iostream.h>
#include<string.h>
#include<conio.h>
char *rev(char *s,int n,int i)
{
char t;
if(i<n/2)
{
t=s[i];
s[i]=s[n-i-1];
s[n-i-1]=t;
i++;
rev(s,n,i);
}
return s;
}
void main()
{
char *s;
cout<<"\n\tEnter a String ";
cin>>s;
int n=strlen(s);
rev(s,n,0);
cout<<"\n\tReversed String :"<<s;
getch();
}

【讨论】:

  • 请更好地格式化您的代码。另外,考虑用标准 C++ 重写你的答案(&lt;iostream&gt; 而不是&lt;iostream.h&gt;&lt;cstring&gt; 而不是&lt;string.h&gt;,根本没有&lt;conio.h&gt;)等等。
  • 我的 turboc3 编译器找不到 , @pyon
  • 通常我不建议人们仅仅因为旧技术过时而放弃它们。但在这种特殊情况下,我将:请切换到现代的、符合标准的 C++ 实现,如 g++ 或 clang。至于&lt;conio.h&gt;,它是DOS和Windows专用的,所以在其他系统上不起作用。
  • 先生,这段代码的逻辑如何?这是很好,还是太基础了? @pyon
  • 底层算法没有问题,所以我没有对此发表评论。但我会写成this。这是相同的算法,但用更惯用的 C++ 编写。
【解决方案2】:

如果它是递归函数,它应该像这样处理输入:

  1. F("你的字符串")
  2. F("我们的字符串")
  3. F("urstring")

提示每次处理一个字符。伪代码应该喜欢

char* F( char* input)
{
    move last char to the first;
    F(input+1);
    return input;
}

工作代码:

char* reverse( char* input )
{
    int len = strlen( input );
    char tmp = input[ len - 1 ];
    if( len > 1 )
    {
        for( int i = len - 1; i > 0; i-- )
        {
            input[ i ] = input[ i - 1 ];
        }
        input[ 0 ] = tmp;
        reverse( input + 1 );
    }
    return input;
}

【讨论】:

  • 这不会像写的那样工作。不过已经很接近了。
  • 这个算法不起作用。第一个字符总是丢失,而最后一个字符保持不变。
  • 当我说move last char to the first 的意思是“转移”整个字符串而不是复制值。 “abc”->“出租车”
  • 如果input 是空字符串,您的解决方案可能会崩溃。
  • OP 只需要一个想法而不是一个完整的解决方案,对吧?我需要处理 Unicode 吗?
【解决方案3】:

您不能使用加号运算符来连接 char* 指针。

如果允许,我宁愿采取就地方法。这里不想说太多,但是你可以在不访问字符串之外的任何内存的情况下反转一个字符串。然后你的递归可以传递指针。

你可能需要一个辅助函数

void reverse(char *start, char *end)

你是从你的主算法调用的。

edit:这将是一个递归解决方案,但递归调用将是辅助函数而不是主函数。不知道你的作业中是否允许这样做。可能还有一种方法可以使其在 main 函数上递归,但这会更复杂。

【讨论】:

  • Helper 不是必需的,如果你想放弃尾调用。记住字符串中的最后一个字符,将其归零,递归调用,然后将其恢复。伙计,我不能停止在最深处的堆栈图像中咯咯笑:)
【解决方案4】:

您需要记住最后一个字符,然后将字符串反转,不包含较短的字符。

所以

F("yourstring") = "g" + F("yourstrin") 

等等等等

幸运的是,小心使用 memcpy 可以就地完成

【讨论】:

  • 我的一个问题是,从 *reverseString(char *string) 函数的主函数调用是否只接收输入的任何字符串的第一个字符?
  • @FyrusDak F 在这种情况下是 reverseString
【解决方案5】:
char* reverse(char *str)
{
    static int i=0;
    static char revstr[100] = "";
   if (*str)
   {
       reverse(str+1);
       revstr[i++]=*str;
   } 
   return revstr;
}

【讨论】:

  • 如果你颠倒了两个字符串然后再次使用第一个呢?这不是一个好的解决方案。
  • 函数调用自己,这就是它反转字符串的方式。据我所知,调用自身的函数是递归的。如果我错了,请通过一些光线
猜你喜欢
  • 2013-03-20
  • 2015-04-21
  • 2022-01-09
  • 2013-02-25
  • 2020-06-28
  • 1970-01-01
  • 2011-03-26
  • 2015-09-27
相关资源
最近更新 更多