求子串最后一次出现的索引:C语言函数返回结果异常
问题分析
你的代码只能找到子串第一次出现的位置,且返回的是1起始的索引,和你要找最后一次出现的0起始索引需求不符,具体问题点:
- 现有循环逻辑:当子串匹配完成(
j==l2)就立刻终止遍历并返回,不会继续检查主串后续内容,因此无法捕获后面的匹配项。 - 返回值计算错误:
return i-j+1得到的是1开始的位置,而你需要的是0开始的索引,应当去掉+1。
修正方案
要实现找子串最后一次出现的0起始索引,需要遍历整个主串,记录所有匹配的起始位置,最后返回最后一次的匹配索引;如果没有匹配,返回-1(避免和合法索引0混淆)。
修正后的代码:
int findsub(const char *str1, const char *str2) { int l1 = 0, l2 = 0; // 计算主串长度 while (*(str1 + l1) != '\0') l1++; // 计算子串长度 while (*(str2 + l2) != '\0') l2++; // 子串为空的特殊情况(可选处理) if (l2 == 0) return 0; // 主串比子串短,直接返回-1 if (l1 < l2) return -1; int last_index = -1; // 遍历所有可能的起始位置,范围是0到l1-l2 for (int i = 0; i <= l1 - l2; i++) { int match = 1; // 检查从i开始的子串是否匹配 for (int j = 0; j < l2; j++) { if (*(str1 + i + j) != *(str2 + j)) { match = 0; break; } } if (match) { last_index = i; // 更新为当前匹配的起始索引 } } return last_index; }
代码说明
- 遍历范围限制在
i <= l1 - l2:避免主串剩余长度不足子串长度时做无效检查。 - 每次匹配成功就更新
last_index,最终保存的就是最后一次匹配的起始索引。 - 返回-1表示未找到子串,比返回0更合理,因为0可能是合法的起始位置。
测试你的案例:主串"mango go man",子串"go",函数会返回7,符合预期。
内容的提问来源于stack exchange,提问作者pi p
相关产品推荐
相关产品推荐

