0

私のプログラムは Caesar Shift コードの暗号化と復号化を行っていますが、現在の主な問題は、ユーザーの選択が正しく機能しないことです。

import java.util.Scanner;
public class CaesarShiftTester
{
public static void main(String [] args)
{
    Scanner in = new Scanner(System.in);
    String message = "";
    String userChoice = "";
    int shift = 0;

    System.out.println("1 - Encrypt\n2 - Decrypt\nQ - Quit Program");
    while(!userChoice.equalsIgnoreCase("Q"))
    {
        System.out.println("Make a selection: ");
        userChoice = in.nextLine();
        if(userChoice.equalsIgnoreCase("1"))
        {
            System.out.print("Please enter a message to be encrypted: ");
            message = in.nextLine();

            System.out.print("Please enter a shift value for the cipher(0 - 25): ");
            shift = in.nextInt();

            CaesarShiftEncryption.genCipherAlphabet(shift);
            System.out.println(CaesarShiftEncryption.encrypt(message));
        }

        else if(userChoice.equalsIgnoreCase("2"))
        {
            System.out.print("Please enter a message to be decrypted: ");
            message = in.nextLine();

            System.out.print("Please enter a shift value for the cipher(0 - 25): ");
            shift = in.nextInt();
        }

        else if(userChoice.equalsIgnoreCase("Q"))
        {
            System.out.println("Thanks for using the program!");
        }
    }
}
}

プログラムの最初の通過後、「選択を行う」が 2 回出力されます。これはクラス内の他のファイルで、この問題ではそれほど大きな役割を果たしていませんが、ファイルを自分でテストしたい場合はここにあります。まだ復号化を実装していないので、「1」と「Q」の選択だけが実際に何かを行うことに注意してください。

public class CaesarShiftEncryption
{
private static final String ALPHABET = "abcdefghijklmnopqrstuvwxyz";
private static String newAlphabet = "";

public CaesarShiftEncryption()
{

}

public static String genCipherAlphabet(int shift)
{
    for(int i = 0; i < ALPHABET.length(); i++)
    {
        int alphabetShift = i + shift;
        alphabetShift = alphabetShift % 26;
        newAlphabet += ALPHABET.charAt(alphabetShift);
    }
    return newAlphabet;
}

public static String encrypt(String message)
{
    int letter = 0;
    String encoded = "";
    char[] messageLetters = new char[message.length()];

    for(int i = 0; i < message.length(); i++)
    {
        messageLetters[i] = message.charAt(i);
    }

    for(int a = 0; a < message.length(); a++)
    {
        if(Character.isWhitespace(messageLetters[a]))
        {
            encoded += " ";
            a++;
        }

        if(Character.isUpperCase(messageLetters[a]))
            messageLetters[a] = Character.toLowerCase(messageLetters[a]);

        letter = ALPHABET.indexOf(messageLetters[a]);  
        encoded += newAlphabet.substring(letter, letter + 1).toUpperCase();
    }
    return encoded;
}
}
4

1 に答える 1

5

でシフト値を読み取ると

shift = in.nextInt();

行末はスキャナーに残ります。次のループ反復で、この残りの行末が読み取られますが、有効な入力 (1、2、または Q) が見つからないため、ループが再度実行されます。

これを修正するには、シフト値を次のように読み取ります。

shift = in.nextInt();
in.nextLine();
于 2013-01-12T06:21:18.053 に答える