You need to enable JavaScript to run this app. 如何在C语言中格式化命令行输入实现栈式括号平衡校验
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.02 14:15:03