我不知道你为什么要把字符放在一个双精度数组中。
如果我迭代一个字符数组,如:
void DoParse(char*pszFormula,无符号nLength){浮动fNum=-1;for(无符号i=0;i<nLength;i++){如果((fNum>=0)&&!isdigit(pszFormula[i]){printf(“Fnum:%f\n”,Fnum);fNum=-1;}开关(pszFormula[i]){大小写“+”:大小写“-”:案例“*”:大小写“/”:printf(“找到运算符%c\n”,pszFormula[i]);断裂;违约:if(是数字(pszFormula[i]){fNum=(fNum>=0?fNum*10:0)+(pszFormula[i]-'0');}断裂;}}如果(fNum>=0){printf(“最后一个fNum:%f\n”,fNum);}}
输入103+34*26
给了我:
编号:103.000000找到操作员+编号:34.000000找到操作员*最后一个fNum:26.000000
输入43-64/6
给了我:
金额:43000000找到操作员-编号:64.000000已找到运算符/最后一个fNum:6.000000
如果我想支持非整数参数,我需要自动变速器
就像OldBoy建议的那样。
void DoParse(char*pszFormula,无符号nLength){char szNum[12];成员集(szNum,0,sizeof(szNum));for(无符号i=0;i<nLength;i++){开关(pszFormula[i]){大小写“+”:大小写“-”:案例“*”:大小写“/”:if(*szNum&&!是数字(pszFormula[i])){浮点f=atof(szNum);printf(“找到一个数字:%f\n”,f);/*净化缓冲器*/成员集(szNum,0,sizeof(szNum));}printf(“找到运算符%c\n”,pszFormula[i]);断裂;大小写“.”:/*将点附加到num缓冲区*/szNum[strlen(szNum)]=pszFormula[i];断裂;违约:if(是数字(pszFormula[i]){/*向num缓冲区追加数字*/szNum[strlen(szNum)]=pszFormula[i];}断裂;}}if(*szNum){浮点f=atof(szNum);printf(“找到的最后一个数字:%f\n”,f);}}
类似输入94.3+43.4/42
现在给出:
找到一个号码:94.30003找到操作员+找到一个号码:43.40002找到操作员/找到的最后一个数字:42.000000
您也可以尝试使用斯特托克
或sscanf公司
.
调试您的定义_类型
方法是让它接受一个输入参数,而不是使用一个全局变量。这样,您可以快速测试各种字符串。从一个简单的整数参数开始,然后是小数,最后是逐渐复杂的表达式。