c - 我的程序没有 printf 就无法运行

标签 c printf

我有一个有趣的问题,我无法弄清楚。 如果没有 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);在 main 下,我的意思是 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);
    }

最佳答案

首先,此代码是不正确的

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

由于字符串未存储在分配的内存中,因此出现内存泄漏。

使用strcpy - 然后使用free将按预期工作。

关于c - 我的程序没有 printf 就无法运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17016219/

相关文章:

C 和无限大小变量

c - C 中带有管道的互斥体

c - 结构和代码解释

c - 线性反馈移位寄存器解释

c - 在 C 编程中存储系统调用

c++ - 在 C++ 中使用 printf() 而不是 cout 有什么主要优势吗?

c++ - strftime 性能与 snprintf

c - printf 样式格式化而不输出

linux - printf 在尝试定位十六进制内存位置时给出问号

c - "scicosim: error. Type 0 not yet supported for outtb."这个问题怎么解决?