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); }
问题原因
- 终止条件字符串错误:内层循环的终止判断
subs != "|\post_exp|"多了一个不必要的转义符\,实际要匹配的结束标记是|post_exp|,错误的转义导致永远无法触发终止条件,循环无限执行。 - 未检查流状态:当
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
相关产品推荐
相关产品推荐

