编写一个算法,检测一个C++源程序文件中的括号是否配对,包括“()[]{}”这三类括号。需要注意的是,单个括号字符,字符串中的括号,注释中的括号均不列入检测范围。用C编写程序实现该算法。选做内容:标注所有不配对括号的位置
时间: 2024-10-08 16:03:42 浏览: 35
为了检测C++源程序文件中的括号是否配对,我们可以使用栈数据结构。栈是一种后进先出(LIFO)的数据结构,非常适合处理这种匹配问题。下面是一个简单的C语言算法实现:
```c
#include <stdio.h>
#include <stdbool.h>
#include <ctype.h>
#include <string.h>
#define MAX_LINE_LENGTH 1000
typedef enum {
LEFT_PAREN = '(',
RIGHT_PAREN = ')',
LEFT_BRACKET = '[',
RIGHT_BRACKET = ']',
LEFT CURLY_BRACE = '{',
RIGHT CURLY_BRACE = '}'
} BracketType;
bool is_valid_bracket(BracketType bracket) {
switch (bracket) {
case LEFT_PAREN:
return true;
case RIGHT_PAREN:
return true;
case LEFT_BRACKET:
return true;
case RIGHT_BRACKET:
return true;
case LEFT CURLY_BRACE:
return true;
case RIGHT CURLY_BRACE:
return true;
default:
return false;
}
}
bool is_matching_pair(BracketType left, BracketType right) {
if (left == right) {
return true;
} else if ((left == LEFT_PAREN && right == RIGHT_PAREN) ||
(left == LEFT_BRACKET && right == RIGHT_BRACKET) ||
(left == LEFT CURLY_BRACE && right == RIGHT CURLY_BRACE)) {
return true;
}
return false;
}
void find_unmatched_brackets(char* filename) {
FILE* file = fopen(filename, "r");
if (!file) {
printf("Error opening file %s\n", filename);
return;
}
bool in_comment = false;
BracketType current_bracket = '\0';
char line[MAX_LINE_LENGTH];
int line_num = 1;
while (fgets(line, sizeof(line), file)) {
for (int i = 0; i < strlen(line); ++i) {
char c = line[i];
// Skip comments and whitespace
if (isWhitespace(c) || c == '/' && (i + 1 < strlen(line) && line[i + 1] == '/')) {
continue;
} else if (c == '/' && line[i + 1] == '*') {
in_comment = !in_comment;
continue;
} else if (c == '*' && line[i - 1] == '/') {
break;
}
// Check if we're inside a comment
if (!in_comment) {
if (isalpha(c)) {
continue;
}
current_bracket = tolower(c);
if (current_bracket == '{' || current_bracket == '[' || current_bracket == '(') {
stack[stack_top++] = current_bracket;
} else if (stack_top > 0 && is_matching_pair(stack[--stack_top], current_bracket)) {
stack_top--;
} else {
printf("Unmatched bracket at line %d position %d: %c\n", line_num, i, current_bracket);
}
}
}
line_num++;
}
fclose(file);
if (stack_top > 0) {
printf("Unmatched brackets at the end of the file: ");
for (int i = 0; i < stack_top; ++i) {
printf("%c ", stack[i]);
}
printf("\n");
}
}
int main(int argc, char** argv) {
if (argc != 2) {
printf("Usage: %s <filename>\n", argv[0]);
return 1;
}
find_unmatched_brackets(argv[1]);
return 0;
}
```
在这个代码中,我们首先读取输入文件的每一行,然后遍历每个字符。如果是括号、字符串或注释,我们会跳过。对于非注释字符,我们会检查它是否开启一个新的括号,并将其压入栈中。如果遇到一个结束括号,我们尝试从栈顶取出匹配的开始括号,如果不匹配,就报告位置。
运行这个程序时,你需要提供一个C++源程序文件作为命令行参数。例如:
```sh
./check_brackets my_program.cpp
```
注意,此代码仅能检测基本的语法错误,实际编译过程中还需要考虑更复杂的嵌套情况和其他可能影响括号匹配的因素。
阅读全文