在c中存储字符串(分段错误)



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

#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("%sn", p[i]);
    }
}

我看到的问题是

  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"

这里有一个多余的分号:

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

此外,字符串的长度不包括,因此malloc(length + 1)

许多问题的修复方法如下:(假设您从给定字符串中找到所有回文)

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));

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

最新更新