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

C++中如何向栈推入指定范围字符串?内层while循环无限运行排查

内层while循环无限运行问题排查与解决

问题描述

代码尝试从字符串流中读取|post_exp|标记之间的内容并推入栈,但内层while循环无限输出"heloo",无法终止。

原代码

int main()
{
    istringstream iss(dtr);
    Stack <string> mudassir;
    mudassir.push1(s1);
    string subs;
    do {
        iss >> subs;
        if (subs == "|post_exp|")
        {
            iss >> subs;
            while (subs != "|\post_exp|")
            {
                mudassir.push(subs);
                cout << "heloo";
                iss >> subs;
            }
        }
    } while (iss);
}

问题原因

  1. 终止条件字符串错误:内层循环的终止判断subs != "|\post_exp|"多了一个不必要的转义符\,实际要匹配的结束标记是|post_exp|,错误的转义导致永远无法触发终止条件,循环无限执行。
  2. 未检查流状态:当iss读取到流末尾时,iss >> subs操作会失败,但此时subs会保留之前的值,若该值不等于错误的终止字符串,循环会持续执行。

修正方案

步骤1:修正终止条件字符串

将内层循环的判断条件改为subs != "|post_exp|",去掉多余的转义符。

步骤2:添加流状态检查

在每次读取操作后检查流的状态,避免流失效后继续执行无效循环。

修正后的代码:

int main()
{
    istringstream iss(dtr);
    Stack <string> mudassir;
    mudassir.push1(s1);
    string subs;
    while (iss >> subs) {  // 直接用流读取结果作为循环条件,避免do-while的无效执行
        if (subs == "|post_exp|")
        {
            // 同时检查流读取状态和终止条件
            while (iss >> subs && subs != "|post_exp|") {
                mudassir.push(subs);
                cout << "heloo";
            }
        }
    }
}

额外说明

  • 把外层的do-while改成while (iss >> subs),可以避免流失效后仍执行一次循环体,减少无效操作。
  • 内层循环合并iss >> subs和终止条件判断,确保只有读取成功后才进行条件检查,避免处理无效的subs值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 12:15:35