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

求子串最后一次出现的索引: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 13:50:19