消息解码/加密程序输出JAVA

消息解码/加密程序输出JAVA,java,Java,我对我编写的程序正在输出的东西感到非常困惑。该程序的目的是解码/编码为一种称为Caesar Shift的代码,它基本上只提取单词/句子的每个字母,并通过“Shift键”将其向右移位。(例如,带换档键1的ab=bc) 我设置了程序,让它要求用户加密/解密,然后是他们想要编码/解码的消息,然后是移位键。我的两个编码/解码函数都有相同的问题。我将重点讨论这个问题的编码,因为它们基本相同 基本上,我设置了编码函数,以便它接受字符串消息和int-ShiftKey的参数。我有一个消息中每个字母的字符串数组。

我对我编写的程序正在输出的东西感到非常困惑。该程序的目的是解码/编码为一种称为Caesar Shift的代码,它基本上只提取单词/句子的每个字母,并通过“Shift键”将其向右移位。(例如,带换档键1的ab=bc)

我设置了程序,让它要求用户加密/解密,然后是他们想要编码/解码的消息,然后是移位键。我的两个编码/解码函数都有相同的问题。我将重点讨论这个问题的编码,因为它们基本相同

基本上,我设置了编码函数,以便它接受字符串消息和int-ShiftKey的参数。我有一个消息中每个字母的字符串数组。我的计划是遍历数组/单词中的每个字母,找到它在字母表中的当前索引,并向其添加shift键,该键存储在int finalIndex中。我把字母表的字母附加在finalIndex索引上,最后打印出这个单词

public static void encode(String message, int shiftKey)
{
    String [] array = message.split("");
    String encoded = "";
    for (String a : array)
    {
        int finalIndex;
        int index = alphabet.indexOf(a);
        finalIndex = index + shiftKey;
        encoded += alphabet.charAt(finalIndex);
    }
    System.out.println(encoded);
}
问题是,当我运行程序时,输出是正确的,除了在编码短语的开头,在shiftKey处总是有一个额外的字母作为字母表的索引。 例如,如果我用shift键1键入消息“hi”,那么它将输出“bij”,因为b是索引1处的字母表,hi只是预期的移位

我什么都试过了,但我不明白为什么会这样。我确信这是这个函数的一个问题,而不是其他任何地方,因为我尝试隔离不同的区域以查看问题所在

任何帮助都将不胜感激。谢谢

完整代码

import java.util.*;
import java.io.*;
public class CaesarShiftTester
{
public static void main (String[] args)
{
    boolean running = true;
    while (running){
        Scanner in = new Scanner (System.in);
        System.out.println("Encryption or Decryption? (E/D): " );
        String answer = in.next();

    if (answer.equalsIgnoreCase("e"))
    {
        System.out.println("Enter message: ");
        String message = in.next();
        System.out.println("Enter Shift Key: " );
        int shiftKey = in.nextInt(); 
        CaesarShiftEncryption.encode(message, shiftKey);

        System.out.println("Quit? (Y/N): ");
        String again = in.next();
        if (again.equalsIgnoreCase("Y"))
            running = false;
        else
            running = true;
    }

    else if (answer.equalsIgnoreCase("d"))
    {
        System.out.println("Enter message: ");
        String message = in.next();
        System.out.println("Enter Shift Key: " );
        int shiftKey = in.nextInt();
        CaesarShiftEncryption.decode(message, shiftKey);

        System.out.println("Quit? (Y/N): ");
        String again = in.next();
        if (again.equalsIgnoreCase("Y"))
                running = false;
        else
            running = true;
    }
    }


}
}
\

import java.io.*;
导入java.util.*;
公共类加密
{
私有静态最终字符串字母表=“abcdefghijklmnopqrstuvwxyz”;
公共静态无效编码(字符串消息,int-shiftKey)
{
字符串[]数组=message.split(“”);
字符串编码=”;
for(字符串a:数组)
{
系统输出打印项次(a);
int finalIndex;
int index=字母表indexOf(a);
finalIndex=索引+移位键;
系统输出打印LN(finalIndex);
编码+=字母表字符(finalIndex);
}
系统输出打印项次(编码);
}
公共静态无效解码(字符串消息,int-shiftKey)
{
焦移位;
字符串编码=”;
对于(int i=0;i
问题在于您对
message.split(“”)函数的使用。它将一个空元素添加到数组中

下面的代码有效

public class test {

  public static void main (String args[])
  {
    char[] array = "ab".toCharArray();
    String alphabet = "abc";
    String encoded = "";
    int shiftKey = 1;

    for (char a : array)
    {
        int finalIndex;
        int index = alphabet.indexOf(a);
        finalIndex = index + shiftKey;
        encoded += alphabet.charAt(finalIndex);
    }

    System.out.println(encoded);
  }    
}
另外,使用toCartArray()方法更适合于此用例。

JDK问题

考虑使用JDK 8

在JDK 7上,如果执行拆分(“”),则拆分函数会在开头添加一个额外的元素

如果无法更新,可以使用char[],或者跳过第一个循环(将增强的for循环更改为常规循环)


我测试了你的代码,效果很好。。这就是为什么如此令人困惑的原因。然后我将JDK更改为版本7,并遇到了与您相同的问题。

请提供一个。当我打印数组的内容时,输出很好,它会按其应该的方式打印消息的每个字母,但当我打印最终索引时,它会打印shiftkey,然后是正确的最终索引,我测试了你的代码,它正常工作。你可能对信息有问题我无法重现这个问题。。。如果我用键1输入“嗨”,我会得到“ij”…你的代码对我有效,我没有看到任何额外的字母。。。这是输出:加密还是解密?(E/D):E输入消息:hi Enter Shift键:1H8I 9I下一票(不是我的)是在您的帖子仅为代码时给出的。此外,您应该将其改写为
encode
方法,而不是
main
方法,并且最好谈谈您对ToCharray的使用。否决票不是我的,但我对此持强硬态度,也不是真的。我已经运行了代码并进行了测试。那么什么是不真实?你想,我已经运行了代码谢谢维克多。很高兴我们共同发现了这个。有趣:)当我们可以这样讨论时总是更好的,堆栈溢出需要更多这样的内容,而不是自我斗争。那很有趣
public class test {

  public static void main (String args[])
  {
    char[] array = "ab".toCharArray();
    String alphabet = "abc";
    String encoded = "";
    int shiftKey = 1;

    for (char a : array)
    {
        int finalIndex;
        int index = alphabet.indexOf(a);
        finalIndex = index + shiftKey;
        encoded += alphabet.charAt(finalIndex);
    }

    System.out.println(encoded);
  }    
}