C语言如何将字符数组中的特殊字符替换为后续首个非特殊字符?
问题根源
你当前代码的核心问题是原数组original和清洗后的数组cleaned共用了同一个下标变量i:
- 遇到特殊字符执行
continue时,i会正常自增,但cleaned数组对应i的位置没有被赋值,会保留初始化前的垃圾值 - 后续的有效字符只会存在
cleaned和原数组对应的下标位置,中间特殊字符对应的位置全部为空/垃圾值,看起来就像读取到特殊字符后就停止了
解决方法
给cleaned数组单独设置一个自增的下标计数器,只有存入有效字符时才让该下标自增,特殊字符跳过的时候下标保持不变,就能把所有有效字符按顺序连续存在cleaned数组里,刚好实现你要的「下一个非特殊字符填充到首个特殊字符位置」的需求。
改后的参考代码如下:
// 建议引入ctype.h头文件,用内置函数替代硬编码ASCII判断,可读性更强 #include <ctype.h> // ... 其他原有代码 int i, j = 0; // j是cleaned数组的专用下标,初始为0 int len = strlen(original); // 提前算长度,避免每次循环都调用strlen降低效率 for(i=0; i < len; i++) { // 判断是否为字母/数字,可替换为你原来的ASCII范围判断逻辑 if (isalnum(original[i])) { cleaned[j] = tolower(original[i]); // 转小写直接用内置tolower函数 j++; // 只有存入有效字符时,cleaned的下标才后移 } // 不是字母数字的特殊字符直接跳过,j保持当前值不变 } cleaned[j] = '\0'; // 必须补字符串结束符,否则后续输出/处理会出现乱码
如果你不想引入额外头文件,保留你原来的ASCII范围判断逻辑也可以,只要把赋值目标的下标从i改成j,且只有赋值完成后让j自增即可。
内容的提问来源于stack exchange,提问作者AerialSong
相关产品推荐
相关产品推荐

