为什么这个程序会引发分段错误?这些函数可以单独运行,但我不明白为什么当我尝试将字符串存储在数组中时出现错误。我需要将所有可能的回文存储在数组中。
#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]);
}
}
答案 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]
并使用strcpy
或strncpy
可能是
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)
。