📄 errortest.c
字号:
#include "ErrorTest.h"
#include "calculate.h"
//#define DEBUG_E 0
int InvalidTest(char *s)
{
char *cp;
cp = s;
while(*cp)
{
if(JudgeChar(*cp) != 1)
{
if(((*cp) < '0')||((*cp) > '9'))
{
printf("非法输入!!\n");
return ERROR;
}
}
if((*cp) == '=')
{
printf("非法输入!!\n");
return ERROR;
}
cp++;
}
return !ERROR;
}
int TestStackEmpty(StackChar *s) //检测栈是否为空
{
if(s->Top == -1)
return EMPTY;
else
return !EMPTY;
}
int GenFlag(char a) //产生特征值
{
switch(a)
{
case '+':return 1;
case '-':return 1;
case '*':return 2;
case '/':return 2;
case '(':return 3;
case ')':return 4;
default: return 0;
}
}
char *strInsert(char *source,const char *insert,int destin)
{
char *cp = source;
char *tail;
if(destin < 0)
destin = 0; //超过字串头部,仍插在头部
if(destin > strlen(source))
destin = strlen(source);//超过字串尾部,仍插在尾部
if((source == NULL)||(insert == NULL))
exit(0); //指针为空,退出
tail = (char *)malloc(sizeof(source));
while((cp - source) != destin)
cp++; //获得后半部字串
strcpy(tail,cp); //将后半部字串保存
*cp = '\0'; //将原字串从后半部截断
strcat(source,insert); //在前半部后面接上待插入字串
strcat(source,tail); //在前一步的基础上,接着插入原字串的后半部
free(tail);
return source;
}
/*检错函数*/
/*检错主要包括:被零除,括号匹配等等*/
//其中形如:(5+)(/5)这样的非法输入应被检出
//另外还应该兼容负数的输入,如:(-5)+9或-5+9
int ErrorTest(char *s)
{ // 0 1 2 3 4
int Flag[5][5] = {{1,1,1,3,1},//0 //特征值矩阵
{1,0,0,1,0},//1
{1,0,0,1,0},//2
{1,2,0,1,0},//3
{3,1,1,3,1}};//4
int pointer = 0,LeftMiss = 0,RightMiss = 0;
StackChar *PAREN; //用于检测括号匹配的栈
InitStackChar(&PAREN);
while(*(s+pointer) != '\0')
{
if(pointer == strlen(s)-1) //尾字符不能是除数字和右括号以外的字符
{
if((GenFlag(*(s+pointer)) != 0)&&(GenFlag(*(s+pointer)) != 4))
{
printf("最后一个字符错误!!\n");
PAREN->Top = -1; //把栈清空
return ERROR;
}
}
if(*(s+pointer) == '(') //遇到左括号入栈
{
PushChar(PAREN,*(s+pointer));
}
if(*(s+pointer) == ')')
{
if(TestStackEmpty(PAREN) == EMPTY) //遇到右括号时若发现栈为空,说明缺左括号,记下缺几个左括号
{
LeftMiss++;
#ifdef DEBUG_E
printf("缺%d个左括号!!\n",LeftMiss);
system("PAUSE");
#endif
//printf("does not match!!\n");
//PAREN->Top = -1; //把栈清空
//return ERROR;
}
else //否则将左括号出栈
PopChar(PAREN);
}
if(pointer != strlen(s)-1) //判断是否为合法输入
{
if(pointer == 0)
{
if((GenFlag(*(s+pointer)) == 2)||(GenFlag(*(s+pointer)) == 4)) //首字符不能为乘除号和右括号
{
printf("第一个字符错误!!\n");
PAREN->Top = -1; //把栈清空
return ERROR;
}
if(GenFlag(*(s+pointer)) == 1) //首字符为加减号,在前面加一个零
{
strInsert(s,"0",0);
}
}
if(Flag[GenFlag(*(s+pointer))][GenFlag(*(s+pointer+1))] == 0)
{
printf("第%d位与第%d位输入错误!!\n",pointer+1,pointer+2);
PAREN->Top = -1; //把栈清空
return ERROR;
}
if(Flag[GenFlag(*(s+pointer))][GenFlag(*(s+pointer+1))] == 2) //"(+"或"(-"可能需要插入'0'
{
if(GenFlag(*(s+pointer+2)) == 0) //如"(+5"这样的情况
strInsert(s,"0",pointer+1);
}
if(Flag[GenFlag(*(s+pointer))][GenFlag(*(s+pointer+1))] == 3) //插入乘号
{
strInsert(s,"*",pointer+1);
}
}
pointer++;
}
if(TestStackEmpty(PAREN) == !EMPTY) //表达式扫描完以后发现栈非空,说明缺右括号,记下缺几个右括号
{
RightMiss = PAREN->Top+1;
//printf("does not match!!!!\n");
//PAREN->Top = -1; //把栈清空
//return ERROR;
}
for(;LeftMiss > 0;LeftMiss--) //在表达式头补齐左括号
{
strInsert(s,"(",0);
}
for(;RightMiss > 0;RightMiss--) //在表达式尾补齐右括号
{
strInsert(s,")",strlen(s));
}
PAREN->Top = -1; //把栈清空
free(PAREN); //free很重要!!
return !ERROR;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -