Java中的ROT13不希望正常工作

时间:2017-11-20 18:58:16

标签: java eclipse rot13

在某些时候,我在使用Java编程ROT13时遇到了麻烦。所以用户应该写任何他想要的东西,程序应该在ROT13中重写它。所以这是我的程序直到现在:

import java.io.*;


public class rot13

{

public static void main (String [] args) throws IOException
    {
    BufferedReader myInput = new BufferedReader (new InputStreamReader (System.in));// Buffered Reader reads the number inputed 

    String key [] = {"A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"};
    String keyA [] = {"N","O","P","Q","R","S","T","U","V","W","X","Y","Z","A","B","C","D","E","F","G","H","I","J","K","L","M"};
    String letter;

    System.out.println("Enter a phrase:");
    String phrase = myInput.readLine();
    int y = 0, i = 0;
    while ( y <= phrase.length()){

        letter = Character.toString(phrase.charAt(y));

        while(i <= y){

            if (letter != key[i]){
                keyA [i] = keyA[i];
            }
            i++;
        }
        System.out.println(keyA [i]);
        y++;
        } 
    }
}

问题如下: 它只会输入几个字母,但是在3行之后停止工作,或者更确切地说是在3个latter之后停止工作并且会出现以下错误:

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 3
    at java.lang.String.charAt(Unknown Source)
    at rot13.main(rot13.java:19)

我尝试过不同的单词,但它会不断打印出同样的问题。有谁知道如何解决它或至少是一种更简洁的方式吗?

提前致谢!!

1 个答案:

答案 0 :(得分:1)

为什么它不起作用

import java.io.*;


public class rot13

{

public static void main (String [] args) throws IOException
{
BufferedReader myInput = new BufferedReader (new InputStreamReader (System.in));// Buffered Reader reads the number inputed 

String key [] = {"A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"};
String keyA [] = {"N","O","P","Q","R","S","T","U","V","W","X","Y","Z","A","B","C","D","E","F","G","H","I","J","K","L","M"};
String letter;

System.out.println("Enter a phrase:");
String phrase = myInput.readLine();
int y = 0, i = 0;
while ( y <= phrase.length()){

    letter = Character.toString(phrase.charAt(y));
    //Each time you go throught the first loop, you are comparing your actual position in the string and i
    //But as you don't reset i back to 0, you only try to compare your previous index and your actual index : if y == 3, so i takes only the values 2 and 3
    //Moreover, when y > 26, you try to access the key array outside of its bounds 
    while(i <= y){
        // letter is a string so you should be using equals
        if (letter != key[i]){
            // You are putting the value at the i index in the i index, so you do basically nothing with this line
            keyA [i] = keyA[i];
        }
        i++;
    }
    System.out.println(keyA [i]);
    y++;
    } 
}

}

替代

这是您可以使用的解决方案:

import java.io.*;


public class rot13 {

public static void main(String[] args) throws IOException {
    BufferedReader myInput = new BufferedReader(new InputStreamReader(System.in));// Buffered Reader reads the number inputed
    System.out.println("Enter a phrase:");
    String input = myInput.readLine();

    //We loop through every char in the string
    for (char c : input.toCharArray()) {
        //We check if the character is a letter, so we don't add the offset to special characters like space or dot
        if (Character.isAlphabetic(c)) {
            //Here we get the lower case version of the char and remove it 97, which is the ascii value of 'a'
            //With this, we are mapping letters from a to z to numbers from 0 to 25
            char lowerChar = (char) (Character.toLowerCase(c) - 97);
            //We add the offset of 13
            lowerChar += 13;
            //We then use the modulo to move numbers higher than 15 back to the beginning
            lowerChar %= 26;
            //We finally come back to the ascii value of our lower case char
            lowerChar += 97;
            System.out.print(Character.isUpperCase(c) ? Character.toUpperCase(lowerChar) : lowerChar);
        } else {
            //If it's not a letter, we just print the char
            System.out.print(c);
        }
    }

    //We don't forget to close our BuffererReader
    myInput.close();
}
}

这是一个描述版本,但您可以通过在一行上执行所有char操作来缩短它