【问题标题】:Recursive function for outputing string用于输出字符串的递归函数
【发布时间】:2021-12-30 20:39:54
【问题描述】:

我有以下代码:

#include <stdio.h>
void recursion(char *ptr) {
    if(*ptr!='J') recursion(ptr++);
    printf("%c",*ptr);
}


void main() {
    char v[]="!zenaJ";
    char *ptr=v;
    recursion(ptr);
}

我想退货 Janez!通过递归函数。编译时我没有任何错误。当我运行程序时,我收到错误“分段错误(核心转储)”。我做错了什么?

【问题讨论】:

  • 你希望recursion(ptr++);做什么?
  • 增加指针并转到下一个字符。当我不使用递归时,它实际上可以工作。
  • 你知道ptr++++ptr之间非常重要的区别吗?
  • 格式字符串"%c%"无效。我猜你的意思是"%c"
  • 感谢您非常有建设性的回答!现在我知道我做错了什么。

标签: c recursion c-strings post-increment


【解决方案1】:

你正在递归地传递相同的指针

if(*ptr!='J') recursion(ptr++);

因为后自增表达式ptr++的值是指针自增前的值。

用C写的函数可以如下所示

void recursion( const char *ptr ) 
{
    if ( *ptr )
    {
        recursion( ptr + 1 );    
        putchar( *ptr );
    }
}

在 C++ 中,函数可以如下所示

std::ostream & recursion( const char *ptr, std::ostream &os = std::cout ) 
{
    if ( *ptr )
    {
        recursion( ptr + 1 );    
        os << *ptr;
    }

    return os;
}

注意,根据C标准,没有参数的函数main应该声明为

int main( void )

在 C++ 中可以这样声明

int main()

【讨论】:

    【解决方案2】:

    ptr 的增量仅发生在 递归调用 recursion 之后。 一个简单的解决方法应该是:

    #include <stdio.h>
    void recursion(char *ptr) {
        if (*ptr != 'J')
        {
            char c = *ptr;
            ptr++;
            recursion(ptr);
            printf("%c",c);
        }
        else
        {
            printf("%c", 'J');
        }
    }
    
    
    void main() {
        char v[]="!zenaJ";
        char *ptr=v;
        recursion(ptr);
    }
    
    

    【讨论】:

      猜你喜欢
      • 2020-02-26
      • 2020-07-19
      • 2022-11-06
      • 1970-01-01
      • 2011-03-26
      • 2015-05-12
      • 2019-05-11
      • 2013-02-25
      相关资源
      最近更新 更多