【问题标题】:Reversing string using pointer in C: Infix to Prefix conversion在 C 中使用指针反转字符串:中缀到前缀的转换
【发布时间】:2018-07-07 18:18:25
【问题描述】:

中缀到前缀 - 首先将中缀的反转转换为后缀,然后 反转结果以获取前缀。

但是问题在于后缀表达式的反转。我怀疑问题在于使用指针。我尝试用其他方式倒车,它奏效了。

但我似乎无法理解为什么会出现问题。

输出:

c*b+a //给定中缀表达式的逆向

cb*a+ //反转中缀表达式的后缀

+a*a+ //前缀:问题

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
/*
Method declarations
....
*/
void main()
{
    char infix[] = "a+b*c";
    char* reverse = rev(exp);
    printf("%s\n", reverse);
    char* postfix = inToPost(reverse);
    printf("%s\n", postfix);
    char* prefix= rev(postfix);
    printf("%s", prefix);
}

char* rev(char* ptr1)
{
    char rev[strlen(ptr1)+1];
    char *temp = ptr1;
    int i =0;
    while(*ptr1!='\0')
    {
        ptr1++;
    }
    do
    {
        rev[i++] = *--ptr1;
    }while(ptr1!=temp);
    rev[i] = '\0';
    ptr1 = rev;
    return ptr1;
}
char* inToPost(char *ptr)
{
    char post[strlen(ptr)+1];
    int i =0;
    while(*ptr!='\0')
    {
        char ch = *ptr;
        if(isOperand(ch))
        {
            post[i++]=ch;
            //printf("%c",ch);
        }
        else if(isOperator(ch))
        {
            while(!isEmpty() && !isOpenP(peek()) && getPrec(peek())>=getPrec(ch))
            {
                post[i++]=peek();
                //printf("%c", peek());
                pop();
            }
            push(ch);
        }
        else if(isOpenP(ch))
        {
            push(ch);
        }
        else if(isCloseP(ch))
        {
            while(!isEmpty() && !isOpenP(peek()))
            {
                post[i++]=peek();
                //printf("%c", peek());
                pop();
            }
            pop();
        }
        ptr++;
    }
    while(!isEmpty())
    {
        post[i++]=peek();
        //printf("%c", peek());
        pop();
    }
    post[i] = '\0';
    ptr = post;
    return ptr;
}

/*
Method definitions
*/

【问题讨论】:

  • 这不是您的直接问题,但请注意 void main() 仅在 Windows 上可接受(在广泛使用的平台中)。有关肮脏的详细信息,请参阅What should main() return in C and C++
  • 糟糕的代码,3倍太长了,这是Ctrc/CtrlV几次尝试?答案错误不是唯一的。代码中的注释建议 OOP,数十个不需要的分配 ... UB ...
  • 你到底想说什么?!我是一个初学者,我不想用这段代码找到工作或任何东西,把它写得整洁而专业。如果你以前用指针解决过,那是很容易理解的。不要无缘无故地粗鲁。
  • 对初学者的建议。以简短清晰的步骤完成工作。执行并测试倒车功能(几行),仅此而已,如果测试良好,请继续下一步。在一次大尝试中不可能在未经检查的(事实上的错误)代码上构建下一层是徒劳​​的

标签: c arrays string pointers


【解决方案1】:

您在rev 函数中犯了一个大写错误,导致undefined behavior:您返回了一个指向局部变量的指针。

rev 函数返回的指针指向rev 数组的第一个元素。一旦函数结束,该数组将超出范围并不再存在。所有指向其中任何元素的指针都将失效。

要么将数组(或者更确切地说是指针)作为参数传递给函数,要么对数组使用动态分配。


在一个不相关的注释中,尽量避免对函数中的局部变量使用相同的名称。它使代码更难阅读和维护。

【讨论】:

  • 不仅在rev 中,而且在inToPost 中(ptr = post; return ptr; 其中post 在本地堆栈上)。
  • 您也可以在不使用本地数组的情况下原位反转数组,或者您可以将本地变量中的反转数组复制到输入数组。我会选择“原位反向”。
  • @Someprogrammerdude:可以理解!
  • > 要么传入一个数组(或者更确切地说是一个指针),我很抱歉。我没有得到这个。这不是我做的吗?
  • @PriyankerRao 到 destination 数组。
猜你喜欢
  • 1970-01-01
  • 2022-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多