0

为什么这个程序会抛出分段错误?这些函数单独运行良好,但我不明白为什么当我尝试将字符串存储在数组中时会出现错误。我需要将所有可能的回文存储在数组中。

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

int isPal(char s[])
{
    int i = 0, j = 0;
    while(s[j]) {
        j++;
    }
    j--;
    while(i <= j) {
        if(s[i] != s[j]) {
            return 0;
        }
        i++;
        j--;
    }
    return 1;
}

char *substring(char s[], int start, int length)
{
    int i, k = 0;
    int end;
    char *p;
    end = start + length - 1;
    p = (char *)malloc(length);
    for(i = start; i <= end; i++ ) {
        p[k] = s[i];
        k++;
    }
    p[k] = 0;
    return p;
}

int main()
{
    char s[] = "madamsalayalaspongo";
    char *p[20];
    int i, j, k = 0;
    for(i = 0; i < strlen(s) - 1; i++) {
        j = 2;
        while(s[j]) {
            if(isPal(substring(s, i, j)));
            {
                p[k] = substring(s, i, j);
                k++;
            }
            j++;
        }
    }
    for(i = 0; i < (k - 1); i++) {
        printf("%s\n", p[i]);
    }
}
4

3 回答 3

0

我看到的问题是

  for(i=0;i<strlen(s)-1;i++)
  {
    j = 2;
    while(s[j])
    {
      if(isPal(substring(s,i,j)));
      {

    p[k] = substring(s,i,j);
    k++;
      }
      j++;
    }
  }

在这里,您在 i 的每次迭代中初始化 j = 2。然后继续提取以 i 为起始索引、j 为长度的子字符串。并且您的内部循环一直持续到 s[j] 变为 0 即字符串结尾。现在对于 i > 0 的任何值(即从 1 开始)和 j = "strlen(s) - 1" (即字符串的最后一个字符),您的子字符串函数将导致“数组越界”并且它可以导致到分段错误。我认为您应该将 j 初始化为“i + 1”

于 2013-08-24T13:45:05.330 回答
0

许多问题请参阅下面的修复:(假设您从给定字符串中找到所有回文)

substring

分配p

p = (char *)malloc(end+2);

main

if(isPal(substring(s,i,j))) ; // 去掉分号

分配的内存p[k]

并使用strcpystrncpy

或许

p[k] = (char *)malloc( (strlen(substring(s,i,j))+1)  * sizeof(char));
strcpy(p[k],  substring(s,i,j));

此外,最好先收集子字符串,以避免多次调用。

于 2013-08-24T14:12:03.913 回答
0

你在这里得到一个多余的分号:

while(s[j]) {
        if(isPal(substring(s, i, j)));//---------Notice!
        {
            p[k] = substring(s, i, j);
            k++;
        }
        j++;
    }

此外,字符串的长度不包括\0, 所以malloc(length + 1).

于 2013-08-24T14:13:10.887 回答