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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 19:24:10