代码之家  ›  专栏  ›  技术社区  ›  infinite

显示正确的输出后,将打印不需要的输出

  •  0
  • infinite  · 技术社区  · 7 年前

    我想出了一个方法,使用递归将infix改为postfix符号,以测试基本程序(它不包含预期部分),我刚刚打印了要评估的字符串。

    示例:如果输入为“ a+(b-c) ”则输出将仅为“ a+b-c ”-->which is b-c will be printed as a separate operand by using recursion when the program exp遇“ ( ”。遇到 ( 时,它以递归方式发送字符串的其余部分,并打印元素,直到遇到 ) —它发送元素遍历的编号,包括 ) 作为返回值遇到。

    现在,我对算法很满意,但打印了一些奇怪的东西。 after The output is printed(which appears to be correct),please have a look and help me:。

    /*输入应该没有缺少的括号(如果有)*/
    
    #包括<stdio.h>
    #包括<string.h>
    #包括<stdlib.h>
    
    有趣(char c[])
    {
    int len=strlen(c),i=0;
    
    当(我!= Le)
    {
    如果(c[i]='(')
    {
    字符cpy[len-i];
    strcpy(cpy,c+i+1);
    +i;
    //递归函数,返回所遍历元素的数目,包括”)“
    i+=乐趣(cpy);
    }
    如果(c[i]=')')
    {
    返回1+i;
    }
    //堆栈操作可用于获取后缀表示法,而不是打印
    printf(“%c”,c[i]);
    +i;
    }
    返回I;
    }
    
    int主()
    {
    int i=0;
    //甚至可以使用下面的注释输入
    //i=fun(“(a+b*(c-d/e*(k-r))+m)”);
    i=乐趣(“((a+b))));
    printf(“\n--------------\n”);
    返回0;
    }
    

    现在,当使用两个不同的输入(一个是注释输入)时引发的错误:


    正在使用的编译器是gcc(gcc)4.8.5 20150623(Red Hat 4.8.5-28)

    示例:如果输入是“A+(B-C)“输出将只是”A+B-C“-->这是小精灵当程序遇到“时,将使用递归作为单独的操作数打印”(“。在遇到(它以递归方式发送字符串的其余部分并打印元素,直到遇到)-它发送包括)作为返回值遇到。

    现在我对算法很满意,但有一些奇怪的东西要打印出来。之后输出已打印(似乎正确),请查看并帮助我:

    /*THE INPUT SHOULD HAVE NO MISSING PARENTHESES (IF THERE ARE ANY) */
    
    #include<stdio.h>
    #include<string.h>
    #include<stdlib.h>
    
    int fun(char c[])
    {
        int len=strlen(c),i=0;
    
        while(i!=len)
        {
            if(c[i]=='(')
            {
                char cpy[len-i];
                strcpy(cpy,c+i+1);
                ++i;
                //RECURSIVE FUNCTION WHICH RETURNS THE NO. OF ELEMTS IT HAS TRAVERSED INCLUDING ")"
                i+=fun(cpy);
            }
            if(c[i]==')')
            {
                return 1+i;
            }
            //INSTEAD OF PRINTING, STACK OPERATION MAY BE USED TO GET THE POSTFIX NOTATION
            printf("%c",c[i]);
            ++i;
        }
        return i;
    }
    
    int main()
    {
        int i=0;
        //EVEN THIS UNDERLYING COMMENTED INPUT CAN BE USED
        //i=fun("(A+B*(C-D/E*(K-R))+M)");  
        i=fun("(((A+B)))");
        printf("\n-------------------\n");
        return 0;
     }
    

    现在,当使用两个不同的输入(一个是注释输入)时引发的错误:

    OUTPUT IS IN RED, IT IS THE INTENDED OUTPUT

    enter image description here


    正在使用的编译器是GCC(GCC)4.8.5 20150623(红帽4.8.5-28)

    2 回复  |  直到 7 年前
        1
  •  1
  •   Jonathan Leffler    7 年前

    comment

    #include <stdio.h>
    #include <string.h>
    
    static int fun(char c[])
    {
        int len = strlen(c), i = 0;
    
        while (i != len)
        {
            if (c[i] == '(')
            {
                char cpy[len - i];
                strcpy(cpy, c + i + 1);
                ++i;
                i += fun(cpy);
            }
            else if (c[i] == ')')
            {
                return 1 + i;
            }
            else
            {
                printf("%c", c[i]);
                ++i;
            }
        }
        return i;
    }
    
    static void evaluate(char *expr)
    {
        printf("expression: [%s]\n", expr);
        int i = fun(expr);
        printf("\ni = %d\n-------------------\n", i);
    }
    
    int main(void)
    {
        evaluate("(((A+B)))");
        evaluate("(A+B*(C-D/E*(K-R))+M)");
        return 0;
    }
    

    expression: [(((A+B)))]
    A+B
    i = 9
    -------------------
    expression: [(A+B*(C-D/E*(K-R))+M)]
    A+B*C-D/E*K-R+M
    i = 21
    -------------------
    

    comment infinite

    ((A+B)^C-(D*E)/F) else if ^

    evaluate()

    #include <stdio.h>
    #include <string.h>
    
    static int fun(char c[])
    {
        int i = 0;
    
        while (c[i] != '\0')
        {
            if (c[i] == '(')
                i += fun(&c[i+1]) + 1;
            else if (c[i] == ')')
                return 1 + i;
            else
            {
                printf("%c", c[i]);
                ++i;
            }
        }
        return i;
    }
    
    static void evaluate(char *expr)
    {
        printf("expression: %zu [%s]\n", strlen(expr), expr);
        int i = fun(expr);
        printf("\ni = %d\n-------------------\n", i);
    }
    
    int main(void)
    {
        evaluate("(((A+B)))");
        evaluate("(A+B*(C-D/E*(K-R))+M)");
        evaluate("A+B*(C-D/E*(K-R))+M");
        evaluate("((A+B)^C-(D*E)/F)");
        return 0;
    }
    

    expression: 9 [(((A+B)))]
    A+B
    i = 9
    -------------------
    expression: 21 [(A+B*(C-D/E*(K-R))+M)]
    A+B*C-D/E*K-R+M
    i = 21
    -------------------
    expression: 19 [A+B*(C-D/E*(K-R))+M]
    A+B*C-D/E*K-R+M
    i = 19
    -------------------
    expression: 17 [((A+B)^C-(D*E)/F)]
    A+B^C-D*E/F
    i = 17
    -------------------
    

    )

        2
  •  0
  •   infinite    7 年前

    while(i!=len) while(i<len)