回 帖 发 新 帖 刷新版面

主题:求帮助啊 C语言的编写题  最好有注释啊

P012H    编写程序,查找c程序中的基本语法错误,如圆括号、方括号、
花括号的不匹配;如单引号和双引号等。要求能够显示错误信息,
并给出错误行数。注意尽可能的考虑软件的通用性。
谢谢好心的哥哥姐姐帮忙 啊

回复列表 (共9个回复)

沙发


#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);
)
测试这个程序的时候就是错悟的也会显示无错误  

希望给点意见 不会改 了

板凳

用栈做配对。

3 楼

我觉得栈的调出调入 应该没错  觉得是上面的函数错误  就是不知道错哪了

4 楼

栈应该是对的 前面的函数错了 不知道怎么改 

5 楼

看报错,调试,重新整理下思路、、

6 楼

程序没有错误 运行后 需要输入文件,假如那个文件的符号不匹配 它也还是显示无错误  纠结

7 楼

这样吧,你把进栈出栈都输出栈内信息,相信就可以解决你的疑惑了:)

8 楼

多么经典的一个问题~~~~。
勾起了俺绵绵的思绪,曾经在学校不吃饭,不睡觉,为了写个BASIC的解释器。
栈,大爷的,就从内个时候起,知道栈有这个用途。后来,知道了,弹夹也是栈。我靠,冲锋枪是加速器,弹夹是堆栈。
继续怀旧中............

9 楼

做单步调试,检查你的进栈出栈的操作是否正确,同时也可以看到程序单步运行的结果和你的预期是不是一样的

我来回复

您尚未登录,请登录后再回复。点此登录或注册