练习1-24 编写一个程序,查找C语言程序中的基本语法错误,如圆括号、方括号、花括号不配对等

来源:互联网 发布:java在线客服系统 编辑:程序博客网 时间:2024/04/28 15:23

错误程序

#include <stdio.h>int checkbrackets(int c);main(){    int c,checkstate;    while((c=getchar())!=EOF){        checkstate=checkbrackets(c);    }    if(checkstate==0){        printf("brackets is lost");    }    else        printf("right");}int checkbrackets(int c){    int d,cbal,checkstate;    checkstate=1;    if(c=='{'||c=='('||c=='['){        if(c=='('){            cbal=c+1;        }        else            cbal=c+2;        while((d=getchar())!=cbal && d!=EOF){            if(d=='{'||c=='('||c=='[')                checkbrackets(d);        }        if(d!=cbal)            checkstate=0;    }    return checkstate;}

测试:

input:   {[[]]}()output:  rightinput:   {[}[}]output:  right   

递归时内部返回过0,但最外部返回的是1,致使出错。错误修正

#include <stdio.h>void checkbrackets(int c);main(){    int c;    while((c=getchar())!=EOF){        checkbrackets(c);    }}void checkbrackets(int c){    int d,cbal;    if(c=='{'||c=='('||c=='['){        if(c=='('){            cbal=c+1;        }        else            cbal=c+2;        while((d=getchar())!=cbal && d!=EOF){                putchar(c); /*测试语句*/            if(d=='{'||c=='('||c=='[')                checkbrackets(d);        }        if(d!=cbal){            printf("brackets is lost\n");        }        else{            putchar(cbal);            putchar(d); /*测试语句*/            printf(" right\n");        }    }}

测试:

input:    {[}[)]output:   }} right      :   ]] rightinput:    {[}(])output:   }} right      :   )) right

理解递归的好例子,本以为先输出 “]] right ” ,结果并不是(其实是的,错误导致)。正确修正

#include <stdio.h>void checkbrackets(int c);main(){    int c;    while((c=getchar())!=EOF){        checkbrackets(c);    }}void checkbrackets(int c){    int d,cbal;    if(c=='{'||c=='('||c=='['){        if(c=='('){            cbal=c+1;        }        else            cbal=c+2;        while((d=getchar())!=cbal && d!=EOF){                putchar(d); /*理解递归调用*/            if(d=='{'||d=='('||d=='[') /*纠正所在,简直令人崩溃*/                checkbrackets(d);        }        if(d!=cbal){            printf("brackets is lost\n");        }        else{            //putchar(cbal);            //putchar(d); /*测试语句*/            printf(" right\n");        }    }}

答案所给程序存在一点bug,如以下输入不报错。

input{[}] 
0 0