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

统计长度为2的子串出现次数,同逻辑C语言失效Python正常求原因

C语言代码存在的问题
  • s2数组长度不足:C语言字符串以\0作为结束标志,你定义s2长度为2,使用gets()读入2个字符的子串时,函数会自动在末尾追加\0,导致数据写入到s2数组外的内存空间,属于缓冲区溢出的未定义行为,会直接篡改内存中其他变量的值(比如s1的内容、count计数),最终得到错误结果。s2的长度至少要设置为3,预留结束符的存储位置。
  • 循环边界越界:当前循环条件为i<strlen(s1),当i取值为strlen(s1)-1时,i+1等于字符串长度,访问s1[i+1]会读到字符串末尾的\0,甚至触发越界访问。正确的循环边界应该是i < strlen(s1)-1,保证每次取相邻两个字符都不会超出s1的有效范围。
  • 使用了不安全的gets函数:gets()不会检查输入内容的长度,只要输入内容超过数组容量就会触发缓冲区溢出,该函数已经被C11标准正式废弃,建议替换为fgets()来读入字符串。
修正后的C代码
#include<stdio.h>
#include<string.h>
int main()
{
    char s1[100], s2[3]; // 调整s2长度预留结束符位置
    int count = 0;
    // 用fgets替代gets,手动去除末尾换行符
    fgets(s1, sizeof(s1), stdin);
    s1[strcspn(s1, "\n")] = '\0';
    fgets(s2, sizeof(s2), stdin);
    s2[strcspn(s2, "\n")] = '\0';
    // 调整循环边界避免越界
    for(int i=0; i < strlen(s1)-1; i++)
    {
        if(s1[i] == s2[0] && s1[i+1] == s2[1])
        {
            count++;
        }
    }
    printf("%d",count);
    return 0;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 22:36:04