我正在用 C 语言制作一个字符串计算器,但我遇到了一些问题。
例如:2 * (123-321) * (2+(3-4)-(3*2*2))/((12-2)/(1+1+1+1) +0+ 1))
应该打印2178
,但它却打印3058704
。
所以我尝试计算 (2+(3-4)-(3*2*2))
并发现它返回 77578153
而不是 -11
。
而且 2*(123-321)*(1-12)/2
返回 1980
而不是 2178
。
#include <stdio.h>
#include <stdlib.h>
char *vnos;
int charToDigit(int i1, int i2) {
int stevilo = 0;
int i;
//printf("%d %d\n",i1,i2);
// printf("%c %d\n",vnos[i1], vnos[i1]);
for(i=i1; i<=i2; i++)
//printf("%d ", (vnos[i1]-48));
stevilo = (stevilo + (vnos[i] - '0'))*10;
stevilo = stevilo/10;
return stevilo;
}
int rekurzija(int zacetek, int konec) {
//printf("bumbum: %d %d \n", zacetek, konec);
int i,oklepaj1,zaklepaj1,oklepaj,zaklepaj;
int zacasniI=0;
i=zacetek;
if(vnos[zacetek] == '(' && vnos[konec] == ')'){
oklepaj = 1;
zaklepaj = 0;
i++;
while(!oklepaj == zaklepaj) {
if (vnos[i] == '(')
oklepaj++;
if (vnos[i] == ')')
zaklepaj++;
i++;
}
i--;
if(i==konec){
return rekurzija(zacetek+1,konec-1);
}
}
for(i=zacetek; i<=konec; i++){
// printf("tralala: %d %d \n", zacetek, konec);
switch(vnos[i]){
case '+':
return rekurzija(zacetek,(i-1))+rekurzija((i+1),konec);
case '-':
if(i>zacasniI)
zacasniI = i;
break;
case '*':
if(zacasniI==0)
zacasniI = i;
break;
case '/':
if(zacasniI==0 || vnos[zacasniI]=='/')
zacasniI = i;
break;
case '(':
oklepaj1 = 1;
zaklepaj1 = 0;
i++;
while(!oklepaj1 == zaklepaj1) {
if (vnos[i] == '(')
oklepaj1++;
if (vnos[i] == ')')
zaklepaj1++;
i++;
}
i--;
break;
}
}
if(zacasniI>0){
switch(vnos[zacasniI]) {
case '-': return rekurzija(zacetek, zacasniI-1)-rekurzija(zacasniI+1, konec);
case '*': return rekurzija(zacetek, zacasniI-1)*rekurzija(zacasniI+1, konec);
case '/': return rekurzija(zacetek, zacasniI-1)/rekurzija(zacasniI+1, konec);
}
}
return charToDigit(zacetek,konec);
}
int main(){
vnos = malloc(sizeof(char) * 9000);
char r;
int z = 0;
int l;
scanf("%c", &r);
while(r != '\n'){
if(r != ' '){
vnos[z] = r;
z++;
}
scanf("%c", &r);
}
int result = rekurzija(0,z-1);
printf("%d\n", result);
return 0;
}
vnos = input
zacetek = start
konec = end
stevilo = number
oklepaj = right parenthesis
zaklepaj = left parenthesis
zacasni = temporary
如有任何帮助,我们将不胜感激。
最佳答案
当输入中有多层括号时,似乎会出现您的问题。
(2+(3-4)-(3*2*2)) --> fail
2+(3-4)-(3*2*2) --> -11 correct
这一行看起来很可疑:
while(!oklepaj1 == zaklepaj1) {
!
的优先级高于 ==
所以你可能的意思是:
while(!(oklepaj1 == zaklepaj1)) {
我尝试了一下,当输入有多层括号时仍然无法正确计算,因此与括号相关的bug较多。
编辑:
我发现了括号中剩下的问题。当遇到括号时,您将括号中的整个表达式发送到 charToDigit
。相反,您应该将一组括号内的内容发送到 rekurzija
。
此外,您正在使用整数除法,因此任何余数都会被删除。这就是 1/2*2
给出 0
的原因。
关于c - C语言中的递归字符串计算器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30527156/