【发布时间】:2017-03-10 06:23:12
【问题描述】:
我在尝试用字符串中的 ASCII 字符替换某些字符时遇到了一些问题。
假设我得到了这个字符串“CCCCCCC”。执行某种方法后,它会变成“CCCCCCa”。然后第二次我将检查倒数第二个字符并执行一些方法来获得“CCCCCca”。然后第三次将检查倒数第三个字符,依此类推,重复 7 次。
for (int i = 0; i < 256; i++){
plaintext = plaintext .substring(0,plaintext .length() - counter) + Character.toString((char)i);
}
我使用 for 循环遍历所有 256 个 ASCII 字符。在我执行一些解密后,计数器将增加。所以基本上第一次是-1(最后一个字符),然后第二次是-2(最后一个字符),以此类推。
让我这么说吧,我第一次希望将所有 256 个 ASCII 附加到我的 7 字节字符串的末尾。然后在我执行一些解密之后,字符串将变为 CCCCCCCa。因此,当我第二次循环时,我会将字符串中的倒数第二个字符替换为所有 256 ASCII。并且经过一些解密后,字符串会变成CCCCCC(a。然后我循环,直到字符串中没有C。
但是,我收到 String index out of range: -1 错误消息。是否有任何其他方法可以在每个 for 循环之后替换大小减小 1 的字符串的最后一个字符?
提前致谢。
【问题讨论】:
-
counter的值是多少? -
首先,您忘记添加字符串的右侧部分(在您更改的字符之后),因此每次循环都会丢失一个字符(第一个除外)。当然,如果您在该循环中的某处增加
counter,您最终将尝试substring(0,-1)您需要迭代plaintext.length()次,而不是256 次。PS:我不会使用低于20 的Character,因为这些是特殊的代码) -
计数器被初始化为1。然后在我在下部执行一些解密后,我将增加它。我试图做的是替换字符串的最后一个字符不是大写的
-
另外,我认为您应该考虑将
StringBuilder用于此类目的。 (或者StringBuffer,如果你想要线程安全) -
我发现它可以替换特定位置的字符: public static String replaceCharAt(String s, int pos, char c) { return s.substring(0,pos) + c + s.子串(pos+1); }