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

C++程序主循环最后一次迭代意外终止问题排查

程序运行异常原因排查

代码里有3个触发未定义行为、逻辑错误的问题,直接导致程序无法跑完所有测试用例:

  • 局部变量m未初始化:int m;声明在循环内部,属于栈上的局部变量,C++不会给这类非静态局部变量默认赋0,初始值是栈内存残留的随机垃圾值。不管是执行m++还是把m存入vector,用到的都是不可预期的垃圾值,属于标准未定义行为。
  • 漏统计字符串末尾的连续'U'片段:现有逻辑只有遍历到字符'D'时,才会把当前累计的连续'U'长度存入vectorn。如果字符串以连续'U'结尾(比如第三个测试用例"UU"、第一个测试用例"UUUDU"末尾的单个'U'),这部分计数不会被存入n,会直接丢失。
  • 空vector越界访问:当字符串全为'U'(比如第三个测试用例"UU")时,遍历全程不会触发push_back操作,n是长度为0的空vector,直接执行cout<<n[0]属于越界访问非法内存,轻则踩坏栈上存储的循环变量i、测试用例数t导致循环逻辑混乱,重则直接触发系统级运行时错误让程序崩溃终止——这就是你观察到输出0后主循环直接停止的核心原因。

除此之外还有个逻辑偏差:你对n做默认升序排序后取第一个元素,拿到的是最短连续'U'段的长度,和你预期的输出逻辑不匹配。要得到你说的三个测试用例依次输出3、0、2的结果,实际需要取最长连续'U'段的长度,排序后取尾元素,或者遍历过程中直接维护最大值即可。

修正后可运行代码

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;

int main() {
    int t;
    cin >> t;
    for(int i = 0; i < t; i++){
        string s;
        vector<int> n;
        int m = 0; // 计数变量必须初始化为0
        cin >> s;
        for(int j = 0; j < s.length(); j++){
            if(s[j] == 'U') {
                m++; 
            } else { 
                n.push_back(m); 
                m = 0; 
            }
        }
        n.push_back(m); // 补上字符串末尾的连续U段统计
        sort(n.rbegin(), n.rend()); // 降序排序,首元素就是最长连续U长度
        cout << n[0] << endl;
    }
    return 0;
}

对应你给出的测试输入,运行结果完全符合预期:

输入:
3
UUUDU
DDD
UU
输出:
3
0
2

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 13:39:38