为什么这个程序会抛出分段错误?。函数单独运行很好,但我不明白为什么当我试图将字符串存储在数组中时会出现错误。我需要在数组中存储所有可能的回文。
#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++;
}
此外,字符串的长度不包括