C++ 更改结构中的另一个值后,字符数组长度已更改
所以我在这里遇到了一个奇怪的情况 我正在写一个程序,可以解析布尔表达式和逻辑表达式,比如:(salary*2>10000)和gender='m' 根据本文中的概念,我使用了一个名为Node的结构来表示不同级别的每个操作 我的节点构造是C++ 更改结构中的另一个值后,字符数组长度已更改,c++,parsing,unions,C++,Parsing,Unions,所以我在这里遇到了一个奇怪的情况 我正在写一个程序,可以解析布尔表达式和逻辑表达式,比如:(salary*2>10000)和gender='m' 根据本文中的概念,我使用了一个名为Node的结构来表示不同级别的每个操作 我的节点构造是 class Node { int type; union { int i; double f; char c[LINESIZE]; char buf[LINESIZE]; char tname[LINESIZE];
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;
enode=T(E_ptr);//创建一个术语节点并解析下一个标记
if(enode==NULL){
cout type=ADD;
strcat(op->value.buf,“+”);
//第一个透镜在这里!!!
len=strlen(op->value.buf);
cout value.p[0]=enode;
//第二个透镜在这里!!!
len=strlen(op->value.buf);
cout value.p[1]>value.buf);
如果(op->value.p[1]==NULL){
cout value.buf,enode->value.buf);
操作数=op;
}
返回操作数;
我的输入是高度+0.3>2.0
透镜的长度可以达到9(“高度+”)
但是在我将enode传递给op->value.p[0]之后,len被减少为3。当我打印出来时,它变成“�A.�".
这里出了什么问题?
strcat(op->value.buf,enode->value.buf)
strcat
假定其参数是以字符串结尾的指针。但是,op->value.buf
是指向随机未初始化垃圾的指针。您可能希望使用一个名为eval
的虚拟函数的节点类型层次结构,而不是使用一个具有做任何事情。这将是更容易的理由。<代码> OP>值。P [0 ] = eNoDE;Le= StLLEN(OP>值。BUF);< /代码>在分配给另一个成员之后,你不能读取联盟的成员。只有一个成员在任何给定的时间“活动”-最近分配的一个。尝试写C++而不是C。