c - 我该如何解决这个堆栈溢出错误?

标签 c function recursion c-strings palindrome

我正在编写一个函数,用于检查给定数组是否为回文或未使用递归。

int pal(char p[], int i, int j) {
  if (i > j) return 1;
  if (p[i] != p[j]) {
    return 0;
  }
  pal(p, i++, j--);
}

void palTest() {
  char p1[] = "hello";
  char p2[] = "elle";
  int x;
  x = pal(p1, 0, 4);
  if (x == 0)
    printf("p1 is not a palendrom\n");
  else
    printf("p1 is a palendrom\n");
  x = pal(p2, 0, 3);
  if (x == 0)
    printf("p2 is not a palendrom\n");
  else
    printf("p2 is a palendrom\n");
}

void main() { 
    palTest(); 
}

我预计程序会写 p2 是回文,但它没有打印任何内容。

最佳答案

函数pal

int pal(char p[],int i, int j)
{
if (i > j)
return 1;
    if (p[i] != p[j])
    {
        return 0;
    }
pal(p, i++, j--);
}

具有未定义的行为,因为如果不是 i > j 且不是 p[i] !+ p[j],它不会返回任何内容。

你必须写

int pal(char p[],int i, int j)
{
if (i > j)
return 1;
    if (p[i] != p[j])
    {
        return 0;
    }
    return pal(p, ++i, --j);
}

还要注意,必须使用预自增和预自减运算符。

    return pal(p, ++i, --j);

否则,您将向函数 pal 的下一次调用传递 ij 的相同值。

此外,函数的第一个参数应具有限定符 const

仅使用两个参数就可以更简单地定义该函数。

这是您的程序,其中包含更新的函数定义及其调用。

#include <stdio.h>
#include <string.h>

int pal( const char *s, size_t n )
{
    return n < 2 ? 1 : s[0] == s[n-1] && pal( s + 1, n - 2 ); 
}

void palTest( void )
{
    char p1[] = "hello";
    char p2[] = "elle";
    int x;

    x = pal( p1, strlen( p1 ));
    if (x == 0)
        printf("p1 is not a palendrom\n");
    else
        printf("p1 is a palendrom\n");

    x = pal( p2, strlen( p2 ) );
    if (x == 0)
        printf("p2 is not a palendrom\n");
    else
        printf("p2 is a palendrom\n");
}


int main(void) 
{
    palTest();

    return 0;
}

您可以使用逻辑表达式来代替函数返回语句中的条件运算符

int pal( const char *s, size_t n )
{
    return ( n < 2 ) || ( s[0] == s[n-1] && pal( s + 1, n - 2 ) ); 
}

请记住,根据 C 标准,不带参数的函数 main 应声明为

int main( void ).

关于c - 我该如何解决这个堆栈溢出错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58354281/

相关文章:

c - getc(stdin) 后程序停止工作

java - JNI 从同一源 C 文件、Java 调用函数 JNI

Python 迭代日期列表

Javascript 函数在其他函数中返回未定义

javascript - 将对象数组中的对象展平的递归函数

c - golang 对共享内存的支持

c - 需要在 C 中的源文件之间共享文件指针的方法

c++ - 强制应用程序核心转储并退出的正确方法是什么?

python - 无法将简单的python代码转换为haskell

c - 在C中实例化临时静态列表头指针