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;
}
}
答案 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 = "";
如果方法收到空字符串,您选择的解决方案将取决于您打算返回的内容。