字符串隐藏字符问题排查:移除标点空格后长度异常如何解决?
嘿,我来帮你拆解一下这个问题~
额外字符是什么?
那个“隐藏字符”其实是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
相关产品推荐
相关产品推荐

