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

字符串隐藏字符问题排查:移除标点空格后长度异常如何解决?

嘿,我来帮你拆解一下这个问题~

额外字符是什么?

那个“隐藏字符”其实是Unicode空字符(\u0000)。原因很简单:你创建的cArray长度和原字符串完全一致,但当遇到要跳过的标点/空格时,你只是让start自增,却没有给数组对应位置赋值。而Java中char数组默认初始化时,所有元素都会被设为\u0000——这个字符在控制台是不可见的,但会被算入字符串长度里。

举个例子,你输入的"n on"长度是4(n + 空格 + o + n),处理时跳过了位置1的空格,cArray[1]就保留了默认的空字符。最终字符串是n + \u0000 + o + n,看起来像"non",但实际长度是4。

怎么消除这个问题?

最简洁的解决方式是用StringBuilder来动态构建结果字符串,它会自动只保留你需要的有效字符,不会有空字符残留:

System.out.println("Enter a potential palindrome:");
String strOld = scan.nextLine();
StringBuilder sb = new StringBuilder();
int noCap = 32;

for (int i = 0; i < strOld.length(); i++) {
    char c = strOld.charAt(i);
    // 跳过目标标点和空格
    if ((c > 31 && c < 48) || (c > 57 && c < 65)) {
        continue;
    }
    // 大写转小写
    if (c >= 'A' && c <= 'Z') {
        c += noCap;
    }
    sb.append(c);
}

String str = sb.toString();
System.out.println(str);
System.out.println(str.length());

如果你更习惯用数组处理,也可以先统计有效字符的数量,再创建对应长度的数组填充,避免空位置:

System.out.println("Enter a potential palindrome:");
String strOld = scan.nextLine();
int size = strOld.length();
int validCount = 0;
int noCap = 32;

// 第一步:统计需要保留的字符数量
for (int i = 0; i < size; i++) {
    char c = strOld.charAt(i);
    if (!((c > 31 && c < 48) || (c > 57 && c < 65))) {
        validCount++;
    }
}

// 第二步:创建对应长度的数组并填充
char[] cArray = new char[validCount];
int index = 0;
for (int i = 0; i < size; i++) {
    char c = strOld.charAt(i);
    if ((c > 31 && c < 48) || (c > 57 && c < 65)) {
        continue;
    }
    if (c >= 'A' && c <= 'Z') {
        c += noCap;
    }
    cArray[index++] = c;
}

String str = new String(cArray);
System.out.println(str);
System.out.println(str.length());

这两种方式都能彻底解决空字符的问题,最终得到长度正确的有效字符串。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:19:39