gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 05:33:25 27 4
gpt4 key购买 nike

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

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

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

输出:

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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com