编写一个程序,用于对C源程序进行括号匹配检查,并将检查结果输出到文件中。 程序应检查输入源程序中左右大括号、小括号的个数是否相等,并且符合C语言语法规定的括号嵌套规则,不得交叉嵌套。输入文件最长不超过500个字符。 本程序只检查括号是否匹配,不用对输入源程序中的其它语法成份进行检查
时间: 2023-11-14 10:09:46 浏览: 76
以下是C语言实现的代码:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_LENGTH 500
int main() {
char filename[MAX_LENGTH];
printf("请输入源程序文件名:");
scanf("%s", filename);
FILE* fp = fopen(filename, "r");
if (fp == NULL) {
printf("文件不存在或无法打开!\n");
return 0;
}
char ch;
int left_bracket_count = 0, right_bracket_count = 0;
int left_parenthesis_count = 0, right_parenthesis_count = 0;
int line_number = 1, is_error = 0;
char output_filename[MAX_LENGTH];
sprintf(output_filename, "%s_result.txt", filename);
FILE* output_fp = fopen(output_filename, "w");
while ((ch = fgetc(fp)) != EOF) {
if (ch == '\n') {
line_number++;
} else if (ch == '(') {
left_parenthesis_count++;
} else if (ch == ')') {
right_parenthesis_count++;
if (right_parenthesis_count > left_parenthesis_count) {
fprintf(output_fp, "第%d行:右括号数量大于左括号数量\n", line_number);
is_error = 1;
}
} else if (ch == '{') {
left_bracket_count++;
} else if (ch == '}') {
right_bracket_count++;
if (right_bracket_count > left_bracket_count) {
fprintf(output_fp, "第%d行:右大括号数量大于左大括号数量\n", line_number);
is_error = 1;
}
}
}
if (left_parenthesis_count != right_parenthesis_count) {
fprintf(output_fp, "左右括号数量不相等\n");
is_error = 1;
}
if (left_bracket_count != right_bracket_count) {
fprintf(output_fp, "左右大括号数量不相等\n");
is_error = 1;
}
if (!is_error) {
fprintf(output_fp, "括号匹配检查通过\n");
}
fclose(fp);
fclose(output_fp);
printf("检查结果已输出到文件:%s\n", output_filename);
return 0;
}
```
程序中使用了两个计数器分别记录左右括号、左右大括号的数量,并在读取每个字符时进行更新。在遇到右括号或右大括号时,判断其数量是否大于左括号或左大括号的数量,如果是则输出错误信息。在读取完整个文件后,判断左右括号、左右大括号数量是否相等,如果不相等,则输出错误信息。最终将检查结果输出到文件中。
需要注意的是,程序中使用了 `sprintf` 函数生成输出文件名,可以保证输出文件名不超过最大长度限制。同时,为了避免输出文件名中包含非法字符,可以在输入文件名时对其进行检查,只允许包含字母、数字和下划线。
阅读全文