我必须构建一个C程序,它使用STACK将中缀表示法转换为后缀表示法。这很顺利,它在某种程度上起作用。很久以前,当我上次使用C语言时,我可能不会很好地使用char []变量。
问题在于,当我提供这样的输入时:
A+B*(C*E-D)
我的程序返回:
ABCE*D-*+ĚĚĚĚĚĚĚĚĚĚĚ
因此,当你看到我的程序很好地进行了后缀转换,但是我的结果(ĚĚĚĚĚĚĚĚĚĚĚ)中有一堆“垃圾”字符。
这是我的代码片段(只有我认为不正确的部分,可能是char []的部分以及我如何为postfix []变量赋值:
int main()
{
char infix[20], postfix[20];
int len, tip, i, p=0;
STACK pom;
MAKE_NULL(&pom);
printf ("Unesi izraz.\n");
scanf ("%s", infix);
len = strlen(infix);
for(i=0; i<len; i++)
{
tip = nadi_tip(infix[i]);
if (tip == Lijeva)
{
PUSH (infix[i], &pom);
}
if (tip == Operand)
{
postfix[p] = infix[i];
p++;
}
if (tip == Desna)
{
while (!EMPTY(pom) && (TOP(pom)!= '('))
{
postfix[p++] = TOP(pom);
POP (&pom);
}
POP (&pom);
}
if (tip == Operator)
{
while (!EMPTY(pom) && TOP(pom)!= '(')
{
if(prioritet(infix[i]) <= prioritet(TOP(pom)))
{
postfix[p++] = TOP(pom);
POP (&pom);
}
else break;
}
PUSH(infix[i], &pom);
}
}
while (EMPTY(pom) != 1)
{
postfix[p++] = TOP(pom);
POP(&pom);
}
printf("Izlaz: %s", postfix);
return 0;
}
infix []是我的输入,postfix []是我的输出。我做错了什么我为什么我有ĚĚĚĚĚĚĚĚĚĚĚ角色。提前谢谢!
答案 0 :(得分:4)
看起来你的postfix
字符串上没有NULL终止符。您可以将定义更改为char postfix[20] = {0};
,或者就在printf
之前,您可以添加postfix[p] = '\0';
答案 1 :(得分:3)
您需要NUL终止postfix
。
postfix[p] = 0;
printf...
一种更简单(但效率稍低)的方法是将数组初始化为{0}
或将memset
初始化为0
。
答案 2 :(得分:3)
char infix[20], postfix[20];
您不会初始化这些,也不会在算法结束时追加'\ 0'。
答案 3 :(得分:3)
看起来您的字符串无法终止。
答案 4 :(得分:3)
正如其他人所说,你应该初始化你的数组。
或者,在程序中的任何时候,您都可以使用,
memset (infix ,0, 20);
memset (postfix, 0, 20);
这会将数组元素的所有值设置为零。
答案 5 :(得分:3)
你已经DIDN&T; T NULL终止你的字符串!开玩笑。你是否从那些告诉你的三十多个人那里得到了这个消息?只是为了在其上添加一些信息,垃圾字符试图解释在char[]
结束之后发生在内存中的任何事情。它抓住了内存中的所有内容,直到它遇到一个空终止字符并将其全部吐出,并且每次都是相同的原因是你的char[]
和ĚĚĚĚĚĚĚĚĚĚĚ
得到了每次程序运行时彼此相邻分配。如果你已经知道所有这些,那么我为另一个多余的答案浪费你的时间而道歉。
答案 6 :(得分:0)
我的猜测是你混淆字符和指向字符串的指针。 POP()和PUSH()的定义在哪里?什么是ndi_tip() 为什么不在forloop中使用一个开关,这样更容易阅读和维护。