主题:求帮助啊 C语言的编写题 最好有注释啊
忧郁失去
[专家分:0] 发布于 2011-05-23 16:18:00
P012H 编写程序,查找c程序中的基本语法错误,如圆括号、方括号、
花括号的不匹配;如单引号和双引号等。要求能够显示错误信息,
并给出错误行数。注意尽可能的考虑软件的通用性。
谢谢好心的哥哥姐姐帮忙 啊
回复列表 (共9个回复)
沙发
忧郁失去 [专家分:0] 发布于 2011-05-23 16:40:00
#include<stdio.h>
#include<malloc.h>
#define size 100
typedef char E;
typedef struct{
int top;
E *base;
int Ssize;
}Stack;
void Init(Stack *S){
S->base=(E *)malloc(size*sizeof(E));
S->top=0;
S->Ssize=size;
}int Len(Stack S){
return(S.top);
}int Top(Stack S,E *e){
if(!S.top)return(0);
*e=S.base[S.top-1];
return(1);
}int Push(Stack *S,E e){
if(S->top>=S->Ssize){
S->base=(E *)realloc(S->base,(S->Ssize+1)*sizeof(E));
if(!S->base)return(0);
S->Ssize++;
}S->base[S->top++]=e;
return(1);
}int Pop(Stack *S,E *e){
if(!S->top)return(0);
*e=S->base[--S->top];
return(1);
}int isEmpty(Stack S){
if(!S.top)return(1);return(0);
}void main(){
FILE *in;
Stack S;
long l=1,k=0;
char i[100],ch;
E t;
Init(&S);
printf("文件名:");
scanf("%s",i);
in=fopen(i,"r");
for(;;){
ch=fgetc(in);
if(ch==-1)break;
else if(ch=='\\'){ch=fgetc(in);continue;}
else if(ch!='\''||ch!='\"'&&!Top(S,&t)&&t=='\''||t=='\"')continue;
else if(ch=='('||ch=='['||ch=='{')Push(&S,ch);
else if(ch==')'){
if(!Top(S,&t)){k++;printf("第%ld行多\')\'\n");}
else if(t!='('&&t!='\''&&t!='\"'){k++;printf("第%ld行\')\'用法错误\n",l);}
else if(t=='(')Pop(&S,&t);
}else if(ch==']'){
if(!Top(S,&t)){k++;printf("第%ld行多\']\'\n");}
else if(t!='['&&t!='\''&&t!='\"'){k++;printf("第%ld行\']\'用法错误\n",l);}
else if(t=='[')Pop(&S,&t);
}else if(ch=='}'){
if(!Top(S,&t)){k++;printf("第%ld行多\'}\'\n");}
else if(t!='{'&&t!='\''&&t!='\"'){k++;printf("第%ld行\'}\'用法错误\n",l);}
else if(t=='{')Pop(&S,&t);
}else if(ch=='\''||ch=='\"'){
if(!Top(S,&t)||t!=ch)Push(&S,ch);
else Pop(&S,&t);
}else if(ch=='\n')l++;
}if(!isEmpty(S)){k++;printf("第%ld行发现未知错误\n",l);}
if(k)printf("共%ld个错误\n",k);
else printf("无错误\n");
fclose(in);
)
测试这个程序的时候就是错悟的也会显示无错误
希望给点意见 不会改 了
板凳
cgl_lgs [专家分:21040] 发布于 2011-05-24 07:53:00
用栈做配对。
3 楼
忧郁失去 [专家分:0] 发布于 2011-05-24 08:58:00
我觉得栈的调出调入 应该没错 觉得是上面的函数错误 就是不知道错哪了
4 楼
忧郁失去 [专家分:0] 发布于 2011-05-24 08:59:00
栈应该是对的 前面的函数错了 不知道怎么改
5 楼
fragileeye [专家分:1990] 发布于 2011-05-24 09:12:00
看报错,调试,重新整理下思路、、
6 楼
忧郁失去 [专家分:0] 发布于 2011-05-24 09:29:00
程序没有错误 运行后 需要输入文件,假如那个文件的符号不匹配 它也还是显示无错误 纠结
7 楼
cgl_lgs [专家分:21040] 发布于 2011-05-24 21:07:00
这样吧,你把进栈出栈都输出栈内信息,相信就可以解决你的疑惑了:)
8 楼
cxxcomp [专家分:2370] 发布于 2011-05-26 03:28:00
多么经典的一个问题~~~~。
勾起了俺绵绵的思绪,曾经在学校不吃饭,不睡觉,为了写个BASIC的解释器。
栈,大爷的,就从内个时候起,知道栈有这个用途。后来,知道了,弹夹也是栈。我靠,冲锋枪是加速器,弹夹是堆栈。
继续怀旧中............
9 楼
qldx [专家分:0] 发布于 2011-05-29 11:35:00
做单步调试,检查你的进栈出栈的操作是否正确,同时也可以看到程序单步运行的结果和你的预期是不是一样的
我来回复