You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++竞赛编程如何解析嵌套方括号格式的m×n二维vector输入

C++ 竞赛类嵌套数组输入解析方案

问题根因

你现有代码的核心问题如下:

  • 直接将char类型的数字字符存入int容器,数字字符'1'对应的ASCII值为49,因此输出的是ASCII码而非实际数值
  • 未处理多位数拼接逻辑,比如10会被拆分为'1'和'0'两个独立字符处理
  • 二维数组行插入时机错误,每读到一个数字就插入整行,完全不符合输入结构
  • 字符判断条件x >= 0无意义,应使用isdigit()判断是否为数字字符

正确实现代码

#include <iostream>
#include <vector>
#include <cctype>
using namespace std;

int main() {
    char c;
    vector<vector<int>> res;
    vector<int> cur_row;
    int num = 0;
    bool in_num = false; // 标记当前是否处于数字读取状态

    while (cin >> c) {
        if (c == '[') {
            cur_row.clear();
            in_num = false;
        } else if (c == ']') {
            // 读完一个数字,先存入当前行
            if (in_num) {
                cur_row.push_back(num);
                num = 0;
                in_num = false;
            }
            // 当前行非空说明是内层数组结束,存入结果
            if (!cur_row.empty()) {
                res.push_back(cur_row);
            }
        } else if (isdigit(c) || c == '-') { // 兼容负整数场景
            in_num = true;
            if (c == '-') {
                num = -num;
            } else {
                num = num * 10 + (c - '0'); // 字符转数值,拼接多位数
            }
        } else if (c == ',') {
            // 逗号分隔数字,存入当前行
            if (in_num) {
                cur_row.push_back(num);
                num = 0;
                in_num = false;
            }
        }
    }

    // 测试输出
    for (auto &row : res) {
        for (int i = 0; i < row.size(); i++) {
            if (i) cout << " ";
            cout << row[i];
        }
        cout << endl;
    }
    return 0;
}

竞赛常用输入解析技巧

  • 字符数值混合读取逻辑:优先用char读取分隔符(括号、逗号等),遇到数字字符时手动拼接多位数,通过c - '0'将数字字符转为对应整数值,避免直接存储ASCII码
  • 状态标记法:用布尔变量标记当前读取状态(如是否正在读数字、当前处于第几层括号),适配嵌套结构的解析需求
  • 字符类型判断:使用<cctype>库的isdigit()、isalpha()等函数判断字符类型,避免写无效的条件判断
  • 流预览技巧:用cin.peek()预览下一个字符不读取,跳过无用分隔符后直接读取数值,适合已知数组维度的场景:
    // 已知m行n列的偷懒写法
    int m = 3, n = 4;
    vector<vector<int>> res(m, vector<int>(n));
    char c;
    for (int i = 0; i < m; i++) {
        for (int j = 0; j < n; j++) {
            while (!isdigit(cin.peek()) && cin.peek() != '-') cin.get(c);
            cin >> res[i][j];
        }
    }
    
  • 流状态重置:处理多组输入时,每次解析完成后用cin.clear()重置流状态,cin.ignore()跳过残留的无用字符。

内容的提问来源于stack exchange,提问作者thirdeye

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 14:09:02