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
相关产品推荐
相关产品推荐

