-5

私には理解できない興味深い問題があります。私のプログラムはprintfなしでは動作しません

printf("",L[i-1][j][k],L[i][j-1][k],L[i][j][k-1],L[i-1][j][k-1],L[i-1][j-1][k],L[i][j-1][k-1],L[i-1][j-1][k-1]);

printf("%s",S); という意味ではありません。メインの下では、 getLCS 関数の下の printf を意味します。printf を使用すると、このプログラムの出力は "fskxft" であり、適切な答えです。printf がないと、プログラムの出力は "(w" どうすれば可能ですか? これが私のコードです:

    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>

    void findLCS(char*, char*, char*, int, int, int);
    int*** allocMem(int, int, int);
    void fillMatrix(char*, char*, char*, int***, int, int, int);
    char* getLCS(char*, int***, int, int, int);
    int findMax(int, int, int);
    void freeMem(char*, char*, char*, int***, char*, int, int);

    int main()
    {
        char* X = malloc(1000*sizeof(char));
        char* Y = malloc(1000*sizeof(char));
        char* Z = malloc(1000*sizeof(char));
        X = "bccmzzzxxyizqnlovffmrudbcywrsqkjcxhexftf";
        Y = "kcftkzdlsyjkxkjxfcjhbfkkdwcrgnjdxtgkaxhm";
        Z = "vihfjvbvsklwyxyzobeztllmvfdgsvekcvtqugjw";

        int m = strlen(X);
        int n = strlen(Y);
        int o = strlen(Z);

        int*** L = allocMem(m,n,o);
        fillMatrix(X,Y,Z,L,m,n,o);
        char *S = getLCS(Z,L,m,n,o);
        printf("%s",S);
        freeMem(X,Y,Z,L,S,m,n);

      return 0;
    }

    int*** allocMem(int m, int n, int o)
    {
        int x = m+1, y = n+1, z = o+1;
        int i, j;

        //Allocating Memory
        int *entries = malloc(x * y * z * sizeof(entries));
        int ***L = malloc(x * sizeof(int **));
        for(i = 0; i < x; i++)
        {
            L[i] = malloc(y * sizeof(int *));
            for(j = 0; j < y; j++)
            {
                L[i][j] = entries + (i * y * z) + (j * z);
            }
        }
        return L;
    }
    void fillMatrix(char* X, char* Y, char* Z, int*** L, int m, int n, int o)
    {
        int i, j, k;
        //Filling the LCS matrix
        for (i=0; i<=m; i++)
        {
            for (j=0; j<=n; j++)
            {
                for(k=0; k<=o; k++)
                {
                    if (i == 0 || j == 0 || k == 0)
                    {
                        L[i][j][k] = 0;
                    }
                    else if ((X[i-1] == Y[j-1]) && (Y[j-1] == Z[k-1]))
                    {
                        L[i][j][k] = L[i-1][j-1][k-1] + 1;
                    }
                    else
                    {
                        L[i][j][k] = findMax(L[i-1][j][k], L[i][j-1][k], L[i][j][k-1]);        
                    }
                }
            }
        }
    }
    char* getLCS(char* Z, int*** L, int m, int n, int o)
    {
        int i, j, k;
        int l = L[m][n][o];
        char* S = malloc(l*sizeof(*S));
        int c= l-1;
        int jj, kk;
        for (i=m; i>0; i--)
        {
            for (j=n; j>0; j--)
            {
                if(j > jj)
                {
                    j = jj;
                }
                for(k=o; k>0; k--)
                {
                    if(k > kk)
                    {
                        k = kk;
                    }
                    printf("",L[i-1][j][k],L[i][j-1][k],L[i][j][k-1],L[i-1][j][k-1],L[i-1][j-1][k],L[i][j-1][k-1],L[i-1][j-1][k-1]);
                    if(L[i-1][j][k] == c && L[i][j-1][k] == c && L[i][j][k-1] == c && L[i-1][j][k-1] == c && L[i-1][j-1][k] == c && L[i][j-1][k-1] == c && L[i-1][j-1][k-1] == c && L[i][j][k] == c+1)
                    {
                        S[c]=Z[k-1];
                        c--;
                        i=i-1;
                        j=j-1;
                        k=k-1;
                        jj = j;
                        kk = k;
                    }
                }
            }
        }
        S[l] = '\n';
        return S;
    }

    int findMax(int a, int b, int c)
            {
        int max = a;
        if(b>max)
        {
            max = b;
        }
        if(c>max)
        {
            max = c;
        }
        return max;
    }

    void freeMem(char* X, char* Y, char* Z, int*** L, char* S, int m, int n)
    {
        int i, j;
        int x = m+1, y = n+1;
        free(X);
        free(Y);
        free(Z);
        for(i = 0; i < x; i++)
        {
            for(j = 0; j < y; j++)
            {
                free(L[i][j]);
            }
            free(L[i]);
        }
        free(L);
    }
4

1 に答える 1

3

まず、このコードは正しくありません

    char* X = malloc(1000*sizeof(char));
    char* Y = malloc(1000*sizeof(char));
    char* Z = malloc(1000*sizeof(char));
    X = "bccmzzzxxyizqnlovffmrudbcywrsqkjcxhexftf";
    Y = "kcftkzdlsyjkxkjxfcjhbfkkdwcrgnjdxtgkaxhm";
    Z = "vihfjvbvsklwyxyzobeztllmvfdgsvekcvtqugjw";

文字列が割り当てられたメモリに格納されていないため、メモリリークが発生します。

Use strcpy- free を使用すると、期待どおりに動作します。

于 2013-06-10T02:46:54.003 に答える