内容发布更新时间 : 2025/2/9 14:59:52星期一 下面是文章的全部内容请认真阅读。
功能: 编写一个程序,查找C程序中的基本语法错误,如圆括号、方括号、 花括号不配对等。不要忘记引号(包括单引号和双引号)、换码序列与注解。 (如果读者想把该程序编写成完全通用性的,那么难度比较大。)
Author: C. Date: Jul 1, 2009
Ver:1.2
***********************************************************************/ #include
#define MAXCHAR 1000 #define ON 1 #define OFF 0
#define NOERR 0
#define REMARKERR 1 #define QUTOAERR 2
#define CURLYBRACEERR 3 #define COPYTWO 2
int inputlines(char s[],int); /* 函数原型:输入字符数组 */
int find_qutoa_symbol(char s[],int,int); /* 函数原型:寻找配对的引号 */
int find_end_remark_symbol(char s[],int,int); /* 函数原型:寻找配对的注释符号 */ void copy(char s[],char d[],int,int,int); /* 函数原型:复制数组 */ int del_remark(char s[],char d[],int len); /* 函数原型:删除注释 */
int main()
{
int flag=NOERR,len=0,i=0,n=0,di=0;
char source[MAXCHAR]; /* 保存输入的字符 */
char destination[MAXCHAR]; /* 保存删除注释后的字符数组 */
char curlybrace[MAXCHAR]; /* 保存代表括号左边的代号 */
for (i=0;i source[i]=0; destination[i]=0; curlybrace[i]=0; } i=0; /* 输入待检测的字符数组,调用inputlines函数:保存字符数组,返回字符串长度 */ len=inputlines(source,MAXCHAR); /* 排除注释 将源字符数组删除注释后保存为目标字符数组,返回目标字符串长度 */ len=del_remark(source,destination,len); /* 输出删除注释后的代码 */ printf (\ printf (\ printf (\ /* 读目标字符数组,判断字符是否符合语法 */ i=0; di=0; while (destination[di]!=EOF && flag==NOERR && di /* a. 判断\\,判断换码序列,目的是排除\\'与\\\字符序列中的'与\ if (di } /* b. 判断是\与',调用函数判断处于一行中是否结对,如果是则忽略包含字符,否则flag=2; */ else if (di && (destination[di]=='\\'' \\ || destination[di]=='\ { n=find_qutoa_symbol(destination,di,len); if (n!=di) { /* 找到了结对的引号 */ di=n; } else { /* 未找到结对的引号 */ flag=QUTOAERR; } } /* c. 判断是否存在多行注释的后半部分\有的话flag=1; */ else if (destination[di]=='*' && destination[di+1]=='/' && di flag=REMARKERR; } /* d. 判断{}[]() 注意!!!:这里对类似 {ddd(ddd{}([ddd......EOF 不会提示错误 */ else if (destination[di]=='{' || destination[di]=='[' || destination[di]=='(' && di curlybrace[i]='A'; } else if (destination[di]=='[') { curlybrace[i]='B'; } else if (destination[di]=='(') { curlybrace[i]='C'; } else { ; } i++; } else if (destination[di]=='}' || destination[di]==']' || destination[di]==')') { /* 输入括号右边判断是否正确配对 */ if (destination[di]=='}') { if (i==0 || curlybrace[i-1]!='A') { flag=CURLYBRACEERR; } else { curlybrace[i-1]=0; i--; } } else if (destination[di]==']') { if (i==0 || curlybrace[i-1]!='B') { flag=CURLYBRACEERR; }