我正在读一本关于密码学的书,并认为编写一个编码和解码消息的小程序是一个很酷的主意。
我开始使用一个简单的替换密码,它会替换一个带有不同字母的字母,移动一定的设定数量。 IE浏览器。一个例子是:a-> c,b-> d等,只是移动了2。
我的代码似乎没有正确替换字母。它总是输出我输入的相同内容,甚至认为Key已设置。这是我的代码:
public class Keyshift {
public static int Key = 0;
public static void selectKey(){
Scanner in = new Scanner(System.in);
System.out.println("Enter an integer");
int a = in.nextInt();
Key = Key + a;
}
public static void encode(){
String input = "";
Scanner in = new Scanner(System.in);
System.out.println("Enter a string");
input = in.nextLine();
String[] inputLetters = input.split("");
String[] output = new String[inputLetters.length];
String dictLowercase = new String("abcdefghijklmnopqrstuvwxyz");
String dictUppercase = new String("ABCDEFGHIJKLMNOPQRSTUVWXYZ");
String[] dictLowerArray = dictLowercase.split("");
String[] dictUpperArray = dictUppercase.split("");
for(int i=0;i<inputLetters.length;i++){
for(int c=0;c<25;c++){
if (inputLetters[i]==dictLowerArray[c]){
output[i] = dictLowerArray[((c+Key) % 26)];
}
else if (inputLetters[i]==dictUpperArray[c]){
output[i] = dictUpperArray[((c+Key) % 26)];
}
else {
output[i] = inputLetters[i];
}
}
}
System.out.println("Your encoded message is: ");
System.out.println(Arrays.toString(output));
//System.out.println(Key);
}
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
// TODO code application logic here
selectKey();
encode();
}
}
答案 0 :(得分:1)
String dictLowercase = new String("abcdefghijklmnopqrstuvwxyz");
String dictUppercase = new String("ABCDEFGHIJKLMNOPQRSTUVWXYZ");
char[] dictLowerArray = dictLowercase.toCharArray();//Use toCharArray
char[] dictUpperArray = dictUppercase.toCharArray();
char[] inputLetters = input.toCharArray();
char[] output=new char[inputLetters.length];
for(int i=0;i<inputLetters.length;i++){
for(int c=0;c<25;c++){
if (inputLetters[i]==(dictLowerArray[c])){
output[i] = (char) (dictLowerArray[c]+Key % 26);//Logic Issue
}
else if (inputLetters[i]==(dictUpperArray[c])){
output[i] = (char) (dictUpperArray[c]+Key % 26);
}
else {
output[i] = inputLetters[i];//If not alphabets
}
}
}
char
操作而不是String
。.toCharArray()
代替split
character+Key % 26
。答案 1 :(得分:1)
首先尝试与String
进行比较equals
而不是==
。
此外,如果您发现某些内容已被修改,则无法指定任何break
点。比如说,inputLetters
的第一个字符与dictLowerArray
的第一个字母匹配,现在迭代再次进入第二个循环,这次只有最后一个else
块被执行且值相同,在inputLetters
中被复制到output
数组。
试试这个循环:
for(int i=0;i<inputLetters.length;i++){
for(int c=0;c<25;c++){
flag = false;
if (inputLetters[i].equals(dictLowerArray[c])){
output[i] = dictLowerArray[((c+Key) % 26)];
break;
}
else if (inputLetters[i].equals(dictUpperArray[c])){
output[i] = dictUpperArray[((c+Key) % 26)];
break;
}
else {
flag = true;
}
}
if (flag) {
output[i] = inputLetters[i];
}
}