package edu.secretcode;

import java.util.Scanner;

/**
 * Creates the secret code class.
 *
 * @author
 *
 */
public class SecretCode {
    /**
     * Perform the ROT13 operation
     *
     * @param plainText
     *            the text to encode
     * @return the rot13'd encoding of plainText
     */

    public static String rotate13(String plainText) {
        StringBuffer cryptText = new StringBuffer("");
        for (int i = 0; i < plainText.length() - 1; i++) {
            char currentChar = plainText.charAt(i);
            currentChar = (char) ((char) (currentChar - 'A' + 13) % 26 + 'A');
            cryptText.append(currentChar);
            if (currentChar <= 'A' || currentChar >= 'Z') {
                cryptText.append(plainText.charAt(i));
            }

            else {
                currentChar = (char) ((char) (currentChar - 'A' + 13) % 26 + 'A');
                cryptText.append(currentChar);
            }

        }
        return cryptText.toString();

    }

    /**
     * Main method of the SecretCode class
     *
     * @param args
     */
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        while (1 > 0) {
            System.out.println("Enter plain text to encode, or QUIT to end");
            Scanner keyboard = new Scanner(System.in);
            String plainText = keyboard.nextLine();
            if (plainText.equals("QUIT")) {
                break;
            }
            String cryptText = SecretCode.rotate13(plainText);
            String encodedText = SecretCode.rotate13(plainText);

            System.out.println("Encoded Text: " + encodedText);
        }

    }

}


大家好,我想让这个程序对大写字母进行编码,而让其他字符独自通过输出。例如“ HELLO WORLD!”在运行程序“ URYY \ d_YQ!”后应变为我得到的是YLUHREYLYLBOWJJWBOERYLQDXK,而不是“ URYY \ d_YQ!”这是我应该得到的。如果有人能让我知道我做错了什么,我将不胜感激。提前致谢。

最佳答案

如果您将String匹配与正则表达式结合使用会更容易。
首先,在循环条件下,消除-1。否则,您只能到达倒数第二个字符。

接下来,在if语句之前删除cryptText.append(currentChar);
然后用这个

char currentChar = plainText.charAt(i);
String cS = currentChar+"";
currentChar = (char) ((char) (currentChar - (int)'A' + 13) % 26 + (int)'A');

if (!cS.matches("[A-Z]")) {

    cryptText.append(plainText.charAt(i));
}
else {
    cryptText.append(currentChar);
}


这确实有效,除了我从您想要的字符中得到了一些不同的字符。你好,世界! => URYYB JBEYQ!

09-12 19:16