C++查找给定字符串所有子串程序无输出问题求助
子串查找程序的问题排查与修复
代码中的核心问题
- 类型不匹配:
string::find()返回size_t(无符号整数类型),你用int类型的found接收结果。当找不到子串时,find()返回string::npos(值为无符号整数最大值),赋值给int会变为负数,彻底打乱循环逻辑。 - 循环条件错误:你用
found < str1.size()作为循环条件,当found因类型转换变为负数时,这个条件永远成立,会进入死循环;同时这个条件无法正确判断是否找到子串。 - 重复调用
find()冗余且错误:你在cout中再次调用str1.find(str, found),这不仅重复执行查找操作,还会在found无效时(如npos转成的负数)从字符串起始位置重新查找,输出错误结果。 - 变量命名易混淆:
str和str1的命名无法区分原字符串和子串,容易搞反查找逻辑。
修正后的代码
#include <iostream> #include <string> using namespace std; int main() { string subStr; // 要查找的子串 string mainStr; // 原字符串 cin >> subStr >> mainStr; size_t found = mainStr.find(subStr); while (found != string::npos) { cout << found << endl; // 从上一次找到的位置的下一位开始继续查找 found = mainStr.find(subStr, found + 1); } }
修正说明
- 将
found改为size_t类型,完全匹配find()的返回值,避免类型转换错误。 - 循环条件改为
found != string::npos,找不到子串时直接退出循环,逻辑清晰。 - 直接输出找到的位置
found,去掉冗余的find()调用,保证输出结果准确。 - 重命名变量为
subStr和mainStr,明确各自的作用,避免逻辑混淆。
当输入ab和aabb时,修正后的代码会输出1,对应"aabb"中ab子串的起始索引位置。
内容的提问来源于stack exchange,提问作者Michał Matusik
相关产品推荐
相关产品推荐

