Java:Caesar Cipher不会打印出来

时间:2014-01-28 03:53:14

标签: java encryption

代码编译得很好,但最终没有打印任何内容。我是编码的新手,已经在这个问题上工作了好几个小时,而且还在墙上。

以下是代码:

import java.util.Scanner;
public class caesartwo {
public static void main(String[] args) {

    Scanner keyboard = new Scanner(System.in);
    String originalText;
    int shiftValue; 

    //encryption
        System.out.println("What text would you like to encrypt?");
        originalText=keyboard.nextLine();

        //shift value
        System.out.print("\nWhat is the shift value? ");
        shiftValue=keyboard.nextInt();

        //encrypted string
        String encryptedText=encrypt(originalText,shiftValue);

        //print result
        System.out.println("\nThe encrypted text is:\n" + encryptedText);
    }
public static String rotate(String userString, int shiftValue) { 
    String convertedText = "";
    for(int i = 0; i < userString.length(); i++){
    char lowerLetter = userString.charAt(i);

    //uppercase conversion
    char upperLetter = Character.toUpperCase(lowerLetter);
    int charNumber = upperLetter;

    //shift and wrap
    int rotateShift = (charNumber + shiftValue) % 26;
    char shiftLetter = (char) rotateShift;

    //shifted chars
    convertedText += shiftLetter;
    }
  return convertedText;
}
public static String encrypt(String userString, int shiftValue) {
    String encryptedString = rotate(userString , shiftValue);
    return encryptedString;
}
}

现在我必须写更多的单词,因为我有太多的代码文本等等等等。

4 个答案:

答案 0 :(得分:3)

您的rotate()方法中的变量已经模糊不清了。您应该提取它们并使它们成为实例变量,而不是让循环的每次迭代都创建新的变量。你可以做得更简单。用以下代码替换你的旋转方法:

public static String rotate(String userString, int shiftValue) { 
    String convertedText = "";
    int offset = shiftValue % 26 + 26;
    int j;
    for(int i = 0; i < userString.length(); i++){
        j = (userString.charAt(i) - 'a' +offset) % 26;
        convertedText += (char) (j+'a');
    }
  return convertedText;
}

测试它并且它现在吐出一个值。从这里高举劫持算法:http://rosettacode.org/wiki/Caesar_cipher#Java

答案 1 :(得分:1)

你的问题就在这里。

char shiftLetter = (char) rotateShift;
当我通过代码调试时,

shiftletter永远不会被赋值。学习调试代码,您将能够快速找到违规的声明。

答案 2 :(得分:1)

查看第rotateShift = (charNumber + shiftValue) % 26;行。我知道你试图将ASCII值包装起来,这样如果你将'Z'换一,你得到'A'。但是,在ASCII表上,“A”从65开始。将(charNumber + shiftValue)修改为26,答案只能是0到25之间的数字。如果你看一下ASCII表,0-25都是特殊字符,不能像NULL字符和CARRIAGE RETURN那样打印。为了确保获得理想的结果,我建议将(charNumber + shiftValue) % 26加上65,这样您就可以从'A'开始,不会超过'Z'。

答案 3 :(得分:1)

因为这行不会打印

int rotateShift = (charNumber + shiftValue) % 26

它将返回0-25,它未映射到ASCII

中的英文字符

你应该做

int rotateShift = (charNumber - (int)('A') + shiftValue) % 26+ (int)('A');