簡體   English   中英

最長公共子分段故障

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM