同样的程序,在windows xp 和 windows2000下输出结果不一样!
同样的程序,在windows xp 和 windows2000下输出结果不一样!
不知道哪个高手能帮我解决这个问题.
以下的代码,输入:
*(+(a,b),-(c,/(e,f)))
在windows xp下可以正确输出:(a+b)*(c-e/f)
在windows 2000 下输出:((a)+b)*((c)-(e)/f) ,多了很多括号.
把xp编译好的程序copy到2000下,同样多了这些括号,所以应该不是编译器的原因.
代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 100
typedef struct node
{
struct node *left,*right;
char op;
}NODE,*TREE;
int compare(char op1,char op2)
{
int l1,l2;
switch(op1)
{
case '- ':
case '+ ':l1=1;
break;
case '* ':
case '/ ':l1=2;
break;
}
switch(op2)
{
case '- ':
case '+ ':l2=1;
break;
case '* ':
case '/ ':l2=2;
break;
}
if(l1> l2)
return 1;
else if(l1==l2)
return 0;
else
return -1;
}
void printext(TREE t)
{
int brack;
if(t-> left)
{
brack=(compare(t-> op,t-> left-> op)==1);
if(brack)
printf( "( ");
printext(t-> left);
if(brack)
printf( ") ");
}
printf( "%c ",t-> op);
if(t-> right)
{
brack=(compare(t-> op,t-> right-> op)!=-1);
if(brack)
printf( "( ");
printext(t-> right);
if(brack)
printf( ") ");
}
}
void creatbtree(NODE* &bt,char *str)
{
NODE *st[N],*p=NULL;
int top=-1,k,j=0;
char ch;
bt=NULL;
ch=str[j];
while(ch!= '\0 ')
{
switch(ch)
{
case '( ':top++;st[top]=p;k=1;
break;
case ') ':top--;break;
case ', ':k=2;break;
default:p=(NODE*)malloc(sizeof(NODE));
p-> op=ch;
p-> left=p-> right=NULL;
if(bt==NULL)
bt=p;
else
{
switch(k)
{
case 1:st[top]-> left=p;break;
case 2:st[top]-> right=p;break;
}
}
}
j++;
ch=str[j];
}
}
int main()
{
//freopen( "1020.in ", "r ",stdin);
//freopen( "1020.out ", "w ",stdout);
NODE *b;
char gy[N];
scanf( "%s ",&gy);
creatbtree(b,gy);
printext(b);
printf( "\n ");
return 0;
}
[解决办法]
首先应该把scanf的那个错误改过来,虽然实际中并没有影响结果。
我用g++在Windows 2000下运行就是对的,但用VC 6就错了(多括号)。
所以还是程序本身有隐蔽的问题。通过DEBUG发现,你的表达式树输出时调用了compare函数比较优先级,但对于字母就没有设置优先级,而直接使用了l1, l2的未初始化的值!这个值如果是一个大的正整数,则没有括号;如果是一个大的负整数,就有括号。而程序在不同的操作系统下对变量的未初始化值可能不同,结果就是这样的“怪异错误”。
在你的compare函数中加一句DEBUG代码,运行一下,你自己也能看出问题所在:
int compare(char op1, char op2)
{
int l1, l2;
switch (op1) {
case '- ':
case '+ ':
l1 = 1;
break;
case '* ':
case '/ ':
l1 = 2;
break;
}
switch (op2) {
case '- ':
case '+ ':
l2 = 1;
break;
case '* ':
case '/ ':
l2 = 2;
break;
}
////////// 加入的代码
printf( "\n DEBUG: l1(%c) = %d, l2(%c) = %d\n ", op1, l1, op2, l2);
if (l1 > l2)
return 1;
else if (l1 == l2)
return 0;
else
return -1;
}