为什么我的C++ while循环即便不满足运行条件也永远不会结束?
核心原因
你代码出现无限循环的根源是std::string::find的返回值处理逻辑错误,和C++、Python的语言差异无关,是代码逻辑漏洞导致的:
- C++的
std::string::find找不到目标字符时,返回的是std::string::npos,这是size_t(无符号整数类型)的最大值,你将它强制转成int后会得到-1 - 你输出
-1后执行了num++,此时num的值变成0 - 接下来进入if判断:
if(num < phraseLength -1 || num ==0),num==0满足条件,不会进入else分支把num设为24 - 下一轮while判断
num < phrase.length() -1 && num > -1,0完全满足条件,循环重新从字符串开头查找,就出现了你看到的重复输出的无限循环问题。
正确实现代码
你不需要手动设置边界值强制终止循环,只需要在每次调用find后先判断是否找到了目标字符,没找到直接跳出循环即可,规范实现如下:
#include <iostream> #include <string> using namespace std; int main() { string phrase = "Hello I am a pineapple"; // 使用size_t匹配find的返回类型,避免有符号/无符号转换的异常 size_t search_pos = 0; while (search_pos < phrase.size()) { size_t found_pos = phrase.find('a', search_pos); // 没找到目标字符,直接终止循环 if (found_pos == string::npos) { break; } cout << found_pos << endl; // 下一次查找从当前匹配位置的下一位开始 search_pos = found_pos + 1; } return 0; }
原有代码的其他问题
- 不要将
find的返回值强制转换为int,size_t是无符号类型,当字符串长度超过int的最大值时,强转会出现溢出错误 - while条件不需要额外判断
num > -1,使用无符号的size_t作为查找位置变量,本身就不会出现小于0的情况 - 手动设置超出边界的值终止循环是冗余逻辑,
find返回npos时直接跳出是行业通用的规范写法
内容的提问来源于stack exchange,提问作者AlexGadd
相关产品推荐
相关产品推荐

