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

时间:2013-08-24 13:18:12

标签: c segmentation-fault c-strings

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

#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]);
    }
}

3 个答案:

答案 0 :(得分: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的任何值都是&gt; 0(即从1开始),j =“strlen(s) - 1”(即字符串的最后一个字符),你的子字符串函数将导致“数组越界”,它可能导致分段错误。我认为你应该将j初始化为“i + 1”

答案 1 :(得分: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));

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

答案 2 :(得分:0)

这里有一个多余的分号:

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

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