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

C语言子串包含判断程序输出异常,请求错误排查

问题分析与代码修正

我帮你找出了代码里的几个关键问题,咱们一步步来修正:

错误点拆解

  • 循环条件不正确:
    原循环的终止条件是i < str1len - str2len,这会漏掉最后一个可能的子串位置。比如当str1长度为5,str2长度为2时,str1len - str2len = 3,合法的起始索引应该是0、1、2、3(共4个位置),但原条件会让循环在i=3时停止,错过最后一次匹配检查。正确的条件应该是i <= str1len - str2len。

  • strncpy未添加字符串终止符:
    strncpy函数不会自动在复制的字符末尾添加'\0',而strcmp要求操作的是以'\0'结尾的合法C字符串。如果不手动添加终止符,sub1里会包含内存中的垃圾数据,导致strcmp的比较结果完全不可靠。复制后需要手动执行sub1[str2len] = '\0';。

  • 循环内的逻辑混乱:
    现在的代码不管第一次循环有没有匹配成功,都会直接输出false并退出程序,这意味着程序只检查了第一个子串就结束了。正确的逻辑应该是:找到匹配时立即输出true并返回;如果循环完整执行完都没找到匹配,再输出false。

修正后的代码

#include <stdio.h>
#include <string.h>

int main(int argc, char **argv){
    // 先检查参数数量是否正确,避免无参导致崩溃
    if (argc != 3) {
        printf("请传入两个字符串参数\n");
        return 1;
    }

    char *str1 = argv[1];
    char *str2 = argv[2];
    int str1len = strlen(str1);
    int str2len = strlen(str2);

    if (str2len > str1len){
        printf("false\n");
        return 0;
    }

    char sub1[100];
    for (int i = 0; i <= str1len - str2len; i++){
        strncpy(sub1, str1 + i, str2len);
        // 手动添加字符串终止符,保证strcmp能正常工作
        sub1[str2len] = '\0';
        if (strcmp(sub1, str2) == 0){
            printf("true\n");
            return 0;
        }
    }
    // 循环结束未找到匹配,输出false
    printf("false\n");
    return 0;
}

另外我还加了参数数量的检查,避免用户忘记传参数导致程序崩溃,这个小细节能让程序更健壮~

内容的提问来源于stack exchange,提问作者nadia

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:45:39