C++程序主循环最后一次迭代意外终止问题排查
程序运行异常原因排查
代码里有3个触发未定义行为、逻辑错误的问题,直接导致程序无法跑完所有测试用例:
- 局部变量
m未初始化:int m;声明在循环内部,属于栈上的局部变量,C++不会给这类非静态局部变量默认赋0,初始值是栈内存残留的随机垃圾值。不管是执行m++还是把m存入vector,用到的都是不可预期的垃圾值,属于标准未定义行为。 - 漏统计字符串末尾的连续'U'片段:现有逻辑只有遍历到字符'D'时,才会把当前累计的连续'U'长度存入vector
n。如果字符串以连续'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
相关产品推荐
相关产品推荐

