Как решить эту ошибку переполнения стека? - PullRequest
0 голосов
/ 12 октября 2019

Я пишу функцию, в которой проверяется, что данный массив является календарным или не использует рекурсию.

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 будет палиндромом, но ничего не печатала.

1 Ответ

4 голосов
/ 12 октября 2019

Функция 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 имеет одинаковые значения i и j.

Также первый параметр функции должен иметь квалификатор 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 ).
...