| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 747 人关注过本帖
标题:c编的四则运算小程序,请指出漏洞和缺点,谢谢!
只看楼主 加入收藏
viky2003
Rank: 5Rank: 5
等 级:职业侠客
帖 子:375
专家分:383
注 册:2007-4-11
结帖率:100%
收藏
 问题点数:0 回复次数:8 
c编的四则运算小程序,请指出漏洞和缺点,谢谢!

#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>
#include <string.h>
bool judge(char *input,int ncount);//判断式子的合法性
bool legal(char *input,int ncount);//判断式子的合法性
int calculate(struct number *phead);//计算只有+法和-法的式子最终结果
struct number *detach(char *input,int ncount);//将数字和符号分离生成链表
struct number *muldiv(struct number *phead);//把所有*法和/法的结果先计算出来生成链表
struct number *headdiv(struct number *phead);//把前面有*法和/法的计算生成开始只有+法或-法的链表
struct number *pend;
struct number
{
int multiply;
char operation;
struct number *next;
};
int main()
{
char instr[100]={'\0'};
int result=0;
int ncount=0;
int index=0;
struct number *pheaddetach=NULL;
struct number *phead=NULL;
struct number *p=NULL;
printf("please input the express(must be shorter than 100 bytes) you want to calculate:\n");
scanf("%s",instr);
ncount=strlen(instr);
printf("%d\n",ncount);
while(!(judge(instr,ncount)))
{
printf("please input again:\n");
scanf("%s",instr);
}
printf("input legal:\n");
pheaddetach=detach(instr,ncount);
for(p=pheaddetach;p;p=p->next)//输出分离后的链表信息
{
printf("%d\n",p->multiply);
printf("%c\n",p->operation);
}
phead=headdiv(pheaddetach);
for(p=phead;p;p=p->next)//输出计算过头指针有/法和*法的生成的链表,如果没有,和分离后的输出相同
{
printf("%d\n",p->multiply);
printf("%c\n",p->operation);
}
phead=muldiv(phead);//输出计算了*法和/法生成的链表
for(p=phead;p;p=p->next)
{
printf("%d\n",p->multiply);
printf("%c\n",p->operation);
}
result=calculate(phead);//计算最后+法和-法得出结果
printf("%d",result);
system("pause");
return 1;

}

bool judge(char *input,int ncount)
{
int num=0;
if((!isdigit(input[0]))||(!isdigit(input[ncount-1])))
{
printf("input error\n");
return false;
}
for(;num<ncount;++num)
{
if(!(isdigit(input[num])||input[num]=='*'||input[num]=='-'||input[num]=='+'||input[num]=='/'))
{
printf("input error\n");
return false;
}
}
return legal(input,ncount);
}

bool legal(char *input,int ncount)
{
int num=0;
int index;
for(;num<ncount;++num)
{
if(!isdigit(input[num]))
{
if(!isdigit(input[num+1]))
{
printf("input error\n");
return false;
}
}
}
return true;
}


int calculate(struct number *phead)
{
struct number *p=NULL;
int ncount=0;
int result=0;
for(p=phead;p->next;p=p->next)
{
if((p->operation=='+')||(p->operation=='-'))
++ncount;
}
while(ncount--)
{
if(phead->operation=='+')
{
p=(struct number*)malloc(sizeof(struct number));
p->multiply=(phead->multiply)+(phead->next->multiply);
p->next=phead->next->next;
p->operation=phead->next->operation;
phead=p;
result=phead->multiply;
}
if(phead->operation=='-')
{
p=(struct number*)malloc(sizeof(struct number));
p->multiply=(phead->multiply)-(phead->next->multiply);
p->next=phead->next->next;
p->operation=phead->next->operation;
phead=p;
result=phead->multiply;
}
}
return result;
}

struct number *detach(char *input,int ncount)
{
int num=0;
struct number *phead=NULL;
struct number *pcur=NULL;
struct number *p;
p->next=NULL;
char copy[100]={'\0'};;
int ind[50]={0};
int i=0;
int j;
for(num=0;num<ncount;++num)
{

if(!(isdigit(input[num])))
{
p=(struct number*)malloc(sizeof(struct number));
p->next=NULL;
++i;
ind[i]=num+1;
p->operation=input[num];
for(j=ind[i-1];j<ind[i]-1;++j)
copy[j-ind[i-1]]=input[j];
p->multiply=atoi(copy);
if(phead==NULL)
phead=pcur=p;
else
pcur->next=p;
pcur=p;
for(j=0;j<100;++j)
copy[j]='\0';
}
}
p=(struct number*)malloc(sizeof(struct number));
for(j=ind[i];j<ncount;j++)
copy[j-ind[i]]=input[j];
p->multiply=atoi(copy);
p->operation='\0';
pcur->next=p;
pend=pcur=p;
pend->next=NULL;
return phead;

}


struct number *headdiv(struct number *phead)
{
struct number *pcur;
if(phead->next!=NULL)
while((phead->operation=='/')||(phead->operation=='*'))
{
if(phead->operation=='*')
{
pcur=(struct number*)malloc(sizeof(struct number));
pcur->multiply=(phead->multiply)*(phead->next->multiply);
pcur->operation=phead->next->operation;
pcur->next=phead->next->next;
phead=pcur;
}
else
{
pcur=(struct number*)malloc(sizeof(struct number));
pcur->multiply=(phead->multiply)/(phead->next->multiply);
pcur->operation=phead->next->operation;
pcur->next=phead->next->next;
phead=pcur;
}
continue;

}
printf("phead muldiv successful\n");
return phead;
}

struct number *muldiv(struct number *phead)
{
int ncount=0;
struct number *p=NULL;
for(p=phead;p;p=p->next)
{
if((p->operation=='/')||(p->operation=='*'))
++ncount;
}
struct number *pcur=NULL;
do
{
for(p=phead;p->next->next;p=p->next)
{
if((p->next->operation=='/')||(p->next->operation=='*'))
{
if(p->next->operation=='/')
{
pcur=(struct number*)malloc(sizeof(struct number));
pcur->multiply=(p->next->multiply)/(p->next->next->multiply);
pcur->operation=p->next->next->operation;
pcur->next=p->next->next->next;;
p->next=pcur;
break;
}
else
{
pcur=(struct number*)malloc(sizeof(struct number));
pcur->multiply=(p->next->multiply)*(p->next->next->multiply);
pcur->operation=p->next->next->operation;
pcur->next=p->next->next->next;
p->next=pcur;
break;
}
}

}
}while(--ncount);
printf("muldiv successful\n");
return phead;

}

搜索更多相关主题的帖子: 漏洞 number struct int 缺点 
2007-08-07 20:09
viky2003
Rank: 5Rank: 5
等 级:职业侠客
帖 子:375
专家分:383
注 册:2007-4-11
收藏
得分:0 
可以计算如:8*9*10+1+2-5/5+8*16-7+5..这样99个字节以内的表达式!!

要练习算法就来http:///!!有挑战哦!!
2007-08-07 20:10
zbqf109
Rank: 1
等 级:新手上路
帖 子:289
专家分:0
注 册:2006-12-31
收藏
得分:0 
这种用正则式比较方便,也比较通用吧

坚决不跟用TC的人打交道!
2007-08-07 22:16
ConZhang
Rank: 1
来 自:北京
等 级:新手上路
帖 子:282
专家分:0
注 册:2007-8-7
收藏
得分:0 
这么长?怎么看啊?
2007-08-07 22:18
viky2003
Rank: 5Rank: 5
等 级:职业侠客
帖 子:375
专家分:383
注 册:2007-4-11
收藏
得分:0 
正则式比较方便,也比较通??什么是正则式??

要练习算法就来http:///!!有挑战哦!!
2007-08-07 22:26
xieyuanchang
Rank: 1
等 级:新手上路
帖 子:23
专家分:0
注 册:2007-8-5
收藏
得分:0 

运行的时候出错了 ....

isdigit()是用来判断是否是数字的函数么?参数是字符型的?还是整型的啊?


2007-08-07 22:39
viky2003
Rank: 5Rank: 5
等 级:职业侠客
帖 子:375
专家分:383
注 册:2007-4-11
收藏
得分:0 

表达式内都是int或者是+,-,*,/符号,不然非法!!


要练习算法就来http:///!!有挑战哦!!
2007-08-08 08:49
hangeng
Rank: 2
等 级:论坛游民
帖 子:424
专家分:39
注 册:2007-7-23
收藏
得分:0 

难道没有注释?


  雨水冲不进窗来,在玻璃上痛哭。但它至少奋斗过。
2007-08-08 12:02
viky2003
Rank: 5Rank: 5
等 级:职业侠客
帖 子:375
专家分:383
注 册:2007-4-11
收藏
得分:0 
要求什么注释??很详细的?/

要练习算法就来http:///!!有挑战哦!!
2007-08-08 13:28
快速回复:c编的四则运算小程序,请指出漏洞和缺点,谢谢!
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.076018 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved