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

C语言拆分字符串奇偶索引打印末尾出现乱码问题求助

问题排查结论

你的乱码问题和fgets的处理无关,核心是拆分得到的奇偶索引字符串没有手动补字符串终止符\0,C语言中char数组默认不会自动在有效内容末尾加\0,而printf输出%s时会一直读到\0才停止,后面读到的未初始化内存垃圾就会显示为乱码。

具体修改点

  • 你注释的终止符赋值逻辑确实是必须的,但原来的写法错误:strlen函数本身依赖\0才能正确计算字符串长度,你在未给evenChar/oddChar补\0的前提下调用strlen,得到的是无效的随机值,自然没法把\0补到正确位置
  • 你已经用nbEven和nbOdd记录了奇偶字符串最后一个有效字符的下标,直接在该下标+1的位置赋值\0即可,不需要调用strlen

修正后的核心代码段

/*Even and odd index processing */
for (int j=0; j<d; j++)
{   
    nbEven=-1;
    nbOdd=-1;
    int len = strlen(s[j]); // 提前计算一次原字符串长度,避免循环中重复调用浪费性能
    for(int i=0 ; i<len; i++)
    {
        if (i%2 == 0)
        {   
            nbEven++;
            evenChar[j][nbEven] = s[j][i]; // 直接用下标访问,写法更易读
        }
        else{
            nbOdd++;
            oddChar[j][nbOdd] = s[j][i];
        }
    }
    // 正确补终止符的写法
    evenChar[j][nbEven + 1] = '\0';
    oddChar[j][nbOdd + 1] = '\0';
}

可选优化点

你当前处理fgets末尾换行的逻辑可以加边界判断,避免用户输入的字符串长度刚好等于缓冲区大小时误删有效字符:

fgets(s[j],sizeof s[j],stdin);
size_t len = strlen(s[j]);
if (len > 0 && s[j][len-1] == '\n') {
    s[j][len-1] = '\0';
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 07:36:02