ROT13 /队长紧缩继续

时间:2013-12-22 14:21:46

标签: java loops rot13

Captain Crunch解码器环的工作原理是将每个字母写成一个字符串并添加13。例如,'a'变为'n','b'变为'o'。字母在末尾“环绕”,所以'z'变成'm'。

这是我从人们的评论中稍微编辑后得到的,但现在它一直告诉我输出可能还没有被初始化,我也不知道为什么......还有什么我需要解决的在我的程序中?

在这种情况下,我只关心编码小写字符

public class captainCrunch {
    public static void main (String[] Args) {

        Scanner sc = new Scanner(System.in);
        String input;

        System.out.print("getting input");
        System.out.println("please enter word: ");
        input = sc.next();

        System.out.print(" ");
        System.out.print("posting output");
        System.out.print("encoding" + input + " results in: " + encode(input));
    }//end of main

/*
*
*/

    public static String encode(String input){
        System.out.print(input.length());
        int length = input.length();
        int index;
        String output;
        char c;
        String temp = " ";

        for (index = 0; index < length; index++) {
            c = input.charAt(index);
            if(c >= 'a' && c <= 'm'){
                c += 13;
            }else if(c >= 'n' && c <= 'z'){
                c -= 13;
            }

            output = temp + (char)(c);
        }
        return output;
    }
}

2 个答案:

答案 0 :(得分:1)

这是因为如果for循环的长度为0,则没有输出值。因此,如果length == 0,那么当您尝试返回时,输出将永远不会被设置。

通过执行以下操作进行修复:

String output="";

此外,您只需将输出设置为一个字符串,每次循环时都需要附加到它,而不是将其设置为全新的值:

output += String.valueOf((char)(c));

你真的最好不要使用StringBuilder

StringBuilder output = new StringBuilder();

    for (index = 0; index < length; index++) {

        c = input.charAt(index);
        if       (c >= 'a' && c <= 'm') c += 13;
        else if     (c >= 'n' && c <= 'z') c -= 13;
        output.append((char)(c));
    }
    return output.toString();

对于这种事情,StringBuilder比String更有效率(因为String是每个连接都必须为不可变的新的)。

答案 1 :(得分:0)

在您的编码方法中,output的唯一赋值是在for循环中。由于编译器无法100%确认for循环将运行(由于条件中使用了变量),因此变量output可能会被未初始化返回,这是编译器禁止的。

逻辑上,当一个空字符串传递给encode()方法时会发生这种情况(因为长度= 0且0不小于0 [在for循环的条件中])。

要解决此问题,请将初始值分配给output,例如null或空字符串,如下所示:

String output = null;

String output = "";

如果方法收到空字符串,您选择的解决方案将取决于您打算返回的内容。