c - 在 C : Infix to Prefix conversion 中使用指针反转字符串

标签 c arrays string pointers

中缀到前缀——首先将中缀反向转换为后缀,然后 反转结果得到前缀。

然而,问题在于后缀表达式的反转。我怀疑问题在于使用指针。我尝试使用其他方式进行倒车并且成功了。

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

输出:

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
*/

最佳答案

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

您从 rev 函数返回的指针指向 rev 数组的第一个元素。该数组将超出范围并在函数结束后不复存在。所有指向其中任何元素的指针都将变为无效。

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


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

关于c - 在 C : Infix to Prefix conversion 中使用指针反转字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51225846/

相关文章:

我可以以位为单位定义 C 元素的大小吗?

c - 短程序在 C 中挂起

c - MPI 库 - 在数组上保存值时出现问题

javascript - 如何从两个字符串数组制作 JSON - 第一个数组具有值,第二个数组具有相同序列的 ID

c - C 中的近似字符串匹配?

java - 科学记数法作为 Double java Android

c - SIGINT 信号后进程终止

ios - 格式化字符串输出的数组项

java - 搜索数组的链接列表并删除链接

c - 将一个字符串插入另一个字符串没有库函数