[英]Longest Common Subsequence-Segmentation fault
我必须编写一个程序来确定最长的公共子序列。
输入:
第一个参数是一个文件,每行包含两个字符串,以分号分隔。 您可以假设每个测试用例只有一个唯一的子序列。 例如
XMJYAUZ; MZJAWXU
输出:
最长的公共子序列。 确保在您打印的每一行上都没有尾随的空格。 例如
MJAU
我正在使用Dev C ++ ..并且正在编译中!!但是这个问题是编程上的挑战 ,当我提交我的答案时,它向我展示了分段错误!
我已经编写了以下代码,但出现了细分错误,我在哪里错了?
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
char str1[100],str2[100];
int len1;
int len2;
void printLCS(char b[len1][len2],char str1[],int i,int j)
{
if(i==0 || j==0)
return;
if(b[i][j]=='c')
{
printLCS(b,str1,i-1,j-1);
printf("%c",str1[i-1]);
}
else if(b[i][j]=='l')
printLCS(b,str1,i,j-1);
else
printLCS(b,str1,i-1,j);
}
void Seq(char str1[],char str2[])
{
int i,j;
len1=strlen(str1);
len2=strlen(str2);
int LCS[len1+1][len2+1];
char b[len1][len2];
for(i=0;i<=len1;i++)
{
LCS[i][0]=0;
}
for(j=0;j<=len2;j++)
{
LCS[0][j]=0;
}
for(i=1;i<=len1;i++)
{
for(j=1;j<=len2;j++)
{
if(str1[i-1]==str2[j-1])
{
LCS[i][j]=1+LCS[i-1][j-1];
b[i][j]='c';
}
else if(LCS[i-1][j]>=LCS[i][j-1])
{
LCS[i][j]=LCS[i-1][j];
b[i][j]='u';
}
else
{
LCS[i][j]=LCS[i][j-1];
b[i][j]='l';
}
}
}
printLCS(b,str1,len1,len2);
}
int main(int argc,char *argv[])
{
if(argc!=2)
{
printf("Invalid Number of Arguments:\n");
exit(0);
}
FILE *fp;
fp=fopen(argv[1],"r");
if(fp==NULL)
{
printf("File can't be opened:\n");
exit(0);
}
char c;
c=fgetc(fp);
while(c!=EOF)
{
int k=0;
if(c=='\n')
c=fgetc(fp);
while(c!=';')
{
str1[k]=c;
k++;
c=fgetc(fp);
}
str1[k]='\0';
c=fgetc(fp);
k=0;
while(c!=EOF && c!='\n')
{
str2[k]=c;
k++;
c=fgetc(fp);
}
str2[k]='\0';
Seq(str1,str2);
printf("\n");
if(c==EOF)
{
break;
}
else
c=fgetc(fp);
}
return 0;
}
我不知道这个网站的系统,但是; 我编译没有错误,结果是正确的。
You didnt close file. Maybe memory leak etc. didnt allowed by site.
而且,不要使用全局变量,除非您不知道其他解决方案
这种用法非常非常糟糕! 无论如何,ISO C90禁止这样做
int len1;
int len2;
void printLCS(char b[len1][len2]...
祝好运。
如果您可以访问Mac或Linux系统,则有一个名为valgrind的奇妙工具,可以帮助您查找这些类型的错误:基本上,它可以在虚拟机中运行程序并监视其对内存的读写操作。
尽管我无法编译您的代码,但我对此for循环感到非常怀疑:
for(i=1;i<=len1;i++)
{
for(j=1;j<=len2;j++)
{
if(str1[i-1]==str2[j-1])
{
LCS[i][j]=1+LCS[i-1][j-1];
b[i][j]='c';
}
else if(LCS[i-1][j]>=LCS[i][j-1])
{
LCS[i][j]=LCS[i-1][j];
b[i][j]='u';
}
else
{
LCS[i][j]=LCS[i][j-1];
b[i][j]='l';
}
}
}
C和C ++中的数组从0开始,因此您感兴趣的最大偏移量可能是strlen - 1
。 尝试将for循环更改为
for(i=1;i<len1;i++)
{
for(j=1;j<len2;j++)
{
...
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.