我在尝试创建的简单c计算器中遇到了细分错误。该计算器应该采用带+,x和方括号的公式,并输出答案。该实现基于两个作为堆栈工作的数组,一个操作数堆栈和一个值堆栈。我正在努力解决细分错误。我已经附上了下面的代码。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void pushValStack(int stack[], int *top, int value){
*top++;
stack[*top] = value;
}
int popValStack(int stack[], int *top){
*top--;
return stack[*top];
}
void pushOpStack(char *stack[], int *top, char *value){
*top++;
stack[*top] = value;
}
char *popOpStack(char *stack[], int *top){
*top--;
return stack[*top];
}
int main(int argc, char *argv[]){
char *token;
int tokenNumber = 1;
int value[51];
int *valueTop = 0;
int valueOne,valueTwo;
char *operand[51];
int *operandTop = 0;
char *operandOne;
token = argv[tokenNumber];
while (token != NULL){
if (*token == '+' || *token == 'x' || *token == '['){
pushOpStack(operand, operandTop, token);
}
else if (*token == ']'){
while (*operand[*operandTop] != '['){
operandOne = popOpStack(operand, operandTop);
if (*operandOne == '+'){
valueOne = popValStack(value, valueTop);
valueTwo = popValStack(value, valueTop);
pushValStack(value, valueTop, valueOne + valueTwo);
}
if (*operandOne == 'x'){
valueOne = popValStack(value, valueTop);
valueTwo = popValStack(value, valueTop);
pushValStack(value, valueTop, valueOne * valueTwo);
}
}
}
else {
pushValStack(value, valueTop, atoi(token));
}
tokenNumber++;
token = argv[tokenNumber];
}
while (*operandTop != 0){
operandOne = popOpStack(operand, operandTop);
if (*operandOne == '+'){
valueOne = popValStack(value, valueTop);
valueTwo = popValStack(value, valueTop);
pushValStack(value, valueTop, valueOne + valueTwo);
}
if (*operandOne == 'x'){
valueOne = popValStack(value, valueTop);
valueTwo = popValStack(value, valueTop);
pushValStack(value, valueTop, valueOne * valueTwo);
}
}
printf("\n%d",popValStack(value, valueTop));
}
答案 0 :(得分:0)
operandTop
是类型int*
的指针变量。您将其初始化为0
(空指针),并且永远不会为其分配其他值。取消引用的任何尝试都将导致不确定的行为,可能是分段错误。
我在没有命令行参数的调试器下运行了程序,该程序在第61行while (*operandTop != 0){
上死了
答案 1 :(得分:0)
您要声明多个int*
变量,但不要为其分配任何内存。它们应该改为int
,因为它们包含堆栈中的索引。
int valueTop = 0;
int operandTop = 0;
然后,您应该使用这些变量,而无需取消引用它们。但是,当将它们传递给需要更新变量的函数时,必须传递变量的地址。
int main(int argc, char *argv[]){
char *token;
int tokenNumber = 1;
int value[51];
int valueTop = 0;
int valueOne,valueTwo;
char *operand[51];
int operandTop = 0;
char *operandOne;
token = argv[tokenNumber];
while (token != NULL){
if (*token == '+' || *token == 'x' || *token == '['){
pushOpStack(operand, &operandTop, token);
}
else if (*token == ']'){
while (*operand[operandTop] != '['){
operandOne = popOpStack(operand, &operandTop);
if (*operandOne == '+'){
valueOne = popValStack(value, &valueTop);
valueTwo = popValStack(value, &valueTop);
pushValStack(value, &valueTop, valueOne + valueTwo);
}
if (*operandOne == 'x'){
valueOne = popValStack(value, &valueTop);
valueTwo = popValStack(value, &valueTop);
pushValStack(value, &valueTop, valueOne * valueTwo);
}
}
}
else {
pushValStack(value, &valueTop, atoi(token));
}
tokenNumber++;
token = argv[tokenNumber];
}
while (operandTop != 0){
operandOne = popOpStack(operand, &operandTop);
if (*operandOne == '+'){
valueOne = popValStack(value, &valueTop);
valueTwo = popValStack(value, &valueTop);
pushValStack(value, &valueTop, valueOne + valueTwo);
}
if (*operandOne == 'x'){
valueOne = popValStack(value, &valueTop);
valueTwo = popValStack(value, &valueTop);
pushValStack(value, &valueTop, valueOne * valueTwo);
}
}
printf("\n%d",popValStack(value, &valueTop));
}