竞赛题字符串分组列读取问题:代码仅输出第一组的修复需求
问题修复请求
给定字符串(如HLOEL-)与数字P(如3),需将字符串按每组P个字符分组,按列读取各组字符(先取每组第1个,再第2个…),最终输出HELLO-。现有C++代码意图通过创建分组变量、嵌套循环实现按列读取,但仅输出第一组内容,要求仅修复现有代码逻辑,不重新实现整体方案。
现有代码
#include <iostream> #include <iomanip> #include <cmath> #include <string> using namespace std; int main() { int P, i, z; string S, L; cin >> P >> S; for (i = 1; i <= P; i++) { string ix = S.substr(0, P); S.erase(0, P); for (z = P; z >= 1; z--) { i = P - z + 1; cout << ix.at(P - z); } } }
输入与输出情况
- 输入示例:
3 HLOEL-
- 预期输出:
HELLO- - 实际输出:
HLO
代码问题分析与修复
核心问题
- 外层循环变量
i被内层循环修改,导致外层循环提前终止。内层循环中i = P - z + 1会重置i的值,第一次外层循环结束后i变回1,无法继续处理后续分组。 - 逻辑完全倒置:当前代码是逐个分组输出所有字符,没有实现“按列遍历所有分组对应位置”的需求。
修复后代码(仅修改原有逻辑,未重构整体结构)
#include <iostream> #include <iomanip> #include <cmath> #include <string> using namespace std; int main() { int P, col, group_idx; string groups[100]; // 预设分组存储数组,可根据实际需求调整大小 int group_count = 0; cin >> P >> S; // 先把所有分组提取并存储,避免原字符串修改后丢失数据 while (!S.empty()) { groups[group_count] = S.substr(0, P); S.erase(0, P); group_count++; } // 按列读取:外层循环控制列位置,内层循环遍历所有分组 for (col = 0; col < P; col++) { for (group_idx = 0; group_idx < group_count; group_idx++) { // 避免分组长度不足P时越界 if (col < groups[group_idx].size()) { cout << groups[group_idx].at(col); } } } }
修复说明
- 先提取所有分组并存储,保证后续可以重复访问每个分组的字符。
- 外层循环控制要读取的列位置(从第0位到第P-1位),内层循环遍历所有分组,输出每个分组对应列的字符,实现按列读取的核心需求。
- 增加字符存在性判断,处理输入字符串长度不是P整数倍的边界情况。
内容的提问来源于stack exchange,提问作者tR00I
相关产品推荐
相关产品推荐

