所以我在这里遇到了一个奇怪的情况。
我正在尝试编写一个可以解析布尔表达式和逻辑表达式的程序,例如:(salary * 2> 10000)AND gender ='M'。
我使用了一个名为Node的结构来根据这里http://en.wikipedia.org/wiki/Syntax_diagram的概念来表示不同级别的每个操作。
我的节点构造
class Node {
int type;
union
{
int i;
double f;
char c[LINESIZE];
char buf[LINESIZE];
char tname[LINESIZE];
char attr[LINESIZE];
struct Node *p[2]; // points to operands of an expression;
struct Node *q; //
} value;
bool eval_b();
Node* eval_e();
Node* eval_t();
Node* eval_f();
};
value.buf存储实际表达式。
enode = T(E_ptr); // Create a TERM Node and parse the next token
if(enode == NULL){
cout << "Error: T() returns NULL" <<endl;
return(NULL);
}
while(token_type == '+' || token_type == '-' )
{
E_ptr = exp_p; //Move the pointer in the input
flag++;
// Initialize a node
op = (struct Node *) malloc(sizeof(struct Node));
strcat(op->value.buf, enode->value.buf);
size_t len;
if(token_type == '+'){
op->type = ADD;
strcat(op->value.buf, " + ");
// The first len here!!!
len = strlen(op->value.buf);
cout << "after + , the len is:" << len << endl;
}
else if(token_type == '-'){
op->type = MINUS;
strcat(op->value.buf, " - ");
}
op->value.p[0] = enode;
// The second len here!!!
len = strlen(op->value.buf);
cout << "before parsing + right , the len is:" << len << endl;
op->value.p[1] = T(E_ptr);
strcat(op->value.buf, op->value.p[1]->value.buf);
if (op->value.p[1] == NULL){
cout <<"Error: Some expression is expected after '+' or '-'." << endl;
free(op);
return(NULL);
}
operand = op;
}
if(flag == 0){
op = (struct Node *) malloc(sizeof(struct Node));
op->type = EXPRESSION;
op->value.q = enode;
strcpy(op->value.buf, enode->value.buf);
operand = op;
}
return operand;
我的输入是身高+ 0.3&gt; 2.0 len可以产生良好的长度,即9.(“高度+”) 但是在我将enode传递给op-&gt; value.p [0]后,len减少到3。当我把它打印出来时,就会变成“ A ”。
这里出了什么问题?