Online Compiler C

#include <stdio.h> int main() { char a[1000]; long long int p = 0; while(a[p] != '\0' ) { p++; } int q1=0,q2=0,q3=0; int p1=0,p2=0,p3=0; scanf("%[^\n]", a); for(int i = 0; i<p;i++) { if(a[i]=='(' && q1 == 0) { q1 = 1; p1++; } else if (a[i]=='(' && q1 == 1) { printf("NO"); return 0; } if(a[i]==')' && q1 == 1) { q1 = 0; p1++; } else if (a[i]==')' && q1 == 0) { printf("NO"); return 0; } // if(a[i]=='[' && q2 == 0) { q2 = 1; p2++; } else if (a[i]=='[' && q2 == 1) { printf("NO"); return 0; } if(a[i]==']' && q2 == 1) { q2 = 0; p2++; } else if (a[i]==']' && q2 == 0) { printf("NO"); return 0; } // if(a[i]=='{' && q3 == 0) { q3 = 1; p3++; } else if (a[i]=='{' && q3 == 1) { printf("NO"); return 0; } if(a[i]=='}' && q3 == 1) { q3 = 0; p3++; } else if (a[i]=='}' && q3 == 0) { printf("NO"); return 0; } } return 0; }
这段代码试图检查括号是否匹配,但存在几个关键问题。

首先,代码在读取用户输入之前就遍历了数组 `a`,此时数组内容未初始化,`while(a[p] != '\0')` 会访问未定义的内存,导致不可预测的行为。正确的做法是先读取输入,再处理字符串。

其次,代码只检查了每种括号是否成对出现,但没有处理括号嵌套的情况。例如 `([)]` 这种序列,每个括号单独看都是成对的,但整体不合法。你的代码会错误地输出"NO"或提前结束。

- 提示1:先调用 `scanf` 读取字符串,然后再遍历处理,不要在读取前就遍历未初始化的数组。
- 提示2:检查括号嵌套时,不能只靠单个标志变量。考虑使用栈结构来记录未匹配的左括号,遇到右括号时检查它是否与栈顶的左括号类型匹配。