#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <string.h> //处理空格 void delspace(char *str) { char *p1 = str; char *p2 = str; while ((*p1 = *(p2++)) != '\0') { if (*p1 != ' ') { p1++; } } } int isnum(char ch)//判断是否数字 { int is = 0; if (ch >= '0' && ch <= '9') { is = 1; } return is; } //获取括号内的字符串 char *mKH(char *str, int *pindex)//配对括号 取出括号内的内容 { char *pstr = NULL; int num = 0;//记录多少括号的对数 int leftindex = *pindex; do { switch (* (str+ (*pindex) )) { case '(': num++; break; case ')': if (0==num) { (*pindex)++; pstr = malloc(sizeof(char)*(*pindex - leftindex));//分配内存大小 strncpy_s(pstr, *pindex - leftindex, str + leftindex, *pindex - leftindex - 1); return pstr; } else { num--;//处理右括号 } break; } } while (*( str+(*pindex)++ ) !='\0' ); } double getnum(char *str, int *pindex) { double value = 0.0; int index = *pindex; while (*(str+index)=='(') { char *psubstr = NULL; *pindex = ++index; psubstr = mKH(str, pindex); double getValue(char *str); value = getValue(psubstr); free(psubstr);//释放内存 psubstr == NULL; return value; } while (isnum(*(str + index)))//str[index] { value = value * 10 + (str[index] - '0');//字符转整数 index++;//往前移动 } if (*(str + index) == '.') { double xiaoshu = 1.0; while (isnum(*(str + ++index)))//循环到小数点后面的非数字 { xiaoshu /= 10;//小数 value += xiaoshu*(*(str + index) - '0'); } } *pindex = index; return value; } double getFirtNum(char *str, int *pindex) { double value = 0.0; value = getnum(str, pindex);//获取一个数据 while (1) { if (*(str + (*pindex)) == '*') { (*pindex)++; value *= getnum(str, pindex);//计算乘法 } else if (*(str + (*pindex)) == '/') { (*pindex)++; value /= getnum(str, pindex);//计算乘法 } else { break; } } return value; } double getValue(char *str) { double value = 0.0; int index = 0; value = getFirtNum(str, &index);//获取第一个数据 while (1) { char ch = *(str + index);//取出字符 index++;//循环遍历 switch (ch) { case '\0': return value; case '+': value += getFirtNum(str, &index); break; case '-': value -= getFirtNum(str, &index); break; default: break; } } } void main() { printf("请输入要计算的表达式:"); char str[1024] = { 0 }; scanf("%[^\n]", str); delspace(str); printf("\n计算表达式值 = %f\n", getValue(str)); system("pause"); }
测试结果:
版权声明:本文为博主原创文章,欢迎指出代码不良之处,及提出代码优化方案。欢迎指点,黑夜代码,拼命奋斗,努力更新中......
原文:http://blog.csdn.net/zhouruifu2015/article/details/47701855