如何在C语言中格式化命令行输入实现栈式括号平衡校验
栈式括号平衡校验(命令行输入适配)错误修正指南
核心错误定位
当前代码的所有编译报错、功能失效全部来自4个可复现的逻辑/语法问题:
- 数据类型错配:栈结构体的
stk成员是char类型单字符数组,但代码尝试将char*类型的字符串指针直接存入栈元素,触发“整数从指针赋值未做类型转换”的警告 - 语法书写错误:
push函数中错将C语言内置类型关键字char当作自定义数组名使用,写出strlen(char[i])、char[i] = other[i]这类完全不符合语法规则的代码,直接触发编译阶段的硬错误 - 比较方法错配:栈元素是单字符(
char类型),代码却将其与双引号包裹的字符串字面量(本质是char*类型的内存指针)做直接相等比较,触发“指针与整数比较”的警告;且单字符对比完全不需要调用strcmp,属于方法完全用错 - 输入解析逻辑错误:代码默认每个
argv数组元素对应一个单括号,但实际用户传入的完整括号表达式会被系统打包为单个argv字符串,逐一遍历argv元素根本无法读取到字符串内部的括号字符
修正操作步骤
- 重写
push函数:将入参调整为接收单个char类型字符,删除无意义的变长数组、语法错误代码段,仅保留核心的栈满判断、栈顶指针移动、单字符入栈逻辑 - 调整匹配比较逻辑:将所有与栈元素对比的括号字面量从双引号字符串改为单引号字符(如
'('、')'),直接做相等比较,移除所有冗余的strcmp调用 - 优化命令行解析流程:适配最常用的使用场景——用户传入1个完整的括号表达式字符串(如
./balance "([{}])"),直接遍历该字符串的每一个字符做逻辑判断,不再逐一遍历argv数组的所有元素 - 补全内存越界保护:遇到闭括号判断时,首先检查栈是否为空(
s.top == -1),若栈空直接判定表达式不平衡,避免读取栈数组的越界内存
可运行修正代码示例
#include<stdio.h> #include<stdlib.h> #include<string.h> #define MAX 100 struct stack { char stk[MAX]; int top; }s; // 入栈:接收单个字符 void push(char item) { if (s.top == (MAX - 1)) { printf ("Stack is Full\n"); return; } s.top++; s.stk[s.top] = item; } // 出栈 void pop() { if (s.top == - 1) { printf ("Stack is Empty\n"); return; } s.top--; } // 返回闭括号对应的匹配开括号 char get_matching_open(char close) { if(close == ')') return '('; if(close == ']') return '['; if(close == '}') return '{'; return '\0'; } int main(int argc, char* argv[]) { // 参数合法性校验 if(argc != 2) { printf("Usage: %s <bracket_expression>\n", argv[0]); return 1; } s.top = -1; char* expr = argv[1]; int i = 0; int is_balanced = 1; for(i = 0; i < strlen(expr); i++) { char c = expr[i]; // 遇到开括号直接入栈 if(c == '(' || c == '[' || c == '{') { push(c); continue; } // 遇到闭括号做匹配校验 if(c == ')' || c == ']' || c == '}') { // 栈空说明没有可匹配的开括号,直接判定不平衡 if(s.top == -1) { is_balanced = 0; break; } char expect_open = get_matching_open(c); if(s.stk[s.top] == expect_open) { pop(); } else { is_balanced = 0; break; } } } // 遍历完成后栈必须为空,才代表所有括号都完成匹配 if(is_balanced && s.top == -1) { printf("\nBALANCED EXPRESSION\n"); } else { printf("\nUNBALANCED EXPRESSION\n"); } return 0; }
编译与使用
- 编译命令:
gcc balance.c -o balance - 运行示例:
./balance "([]){}"→ 输出BALANCED EXPRESSION./balance "([)]"→ 输出UNBALANCED EXPRESSION
内容的提问来源于stack exchange,提问作者h1smajesty
相关产品推荐
相关产品推荐

