c - 最长公共(public)子序列分割错误

标签 c string segmentation-fault

我必须编写一个程序来确定最长公共(public)子序列。

输入:

第一个参数将是一个文件,每行包含两个字符串,以分号分隔。您可以假设每个测试用例只有一个唯一的子序列。例如

XMJYAUZ;MZJAWXU

输出:

最长公共(public)子序列。确保打印的每一行中没有尾随空格。例如

美亚

我正在使用 Dev C++ .. 编译很好!...但是这个问题是 programming challenge当我提交我的答案时,它显示了一个段错误!

我已经写了下面的代码,但我哪里出错了?

#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]...

祝你好运。

关于c - 最长公共(public)子序列分割错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16098843/

相关文章:

c - 将文件数据提取到 4 个单独的表中

c - 如何获取指向C中函数的函数指针?

有人可以告诉我我的代码有什么问题吗?

c - 无法解析标识符 - C 编程

c - fgets() 在末尾包含换行符

c++ - 应用程序中的运行时错误 - 分段失败

python - python 中的 string.replace 方法

java - 给定一个句子,单词之间有多个空格。删除多余的空格,使句子中的单词之间只有一个空格

c - 使用 C 崩溃后监控并自动重启另一个程序

C程序-段错误,原因