公共P012H(南邮c语言实验) 下载本文

内容发布更新时间 : 2024/5/23 19:17:09星期一 下面是文章的全部内容请认真阅读。

功能: 编写一个程序,查找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; }