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
相关产品推荐
相关产品推荐

