代码编译得很好,但最终没有打印任何内容。我是编码的新手,已经在这个问题上工作了好几个小时,而且还在墙上。
以下是代码:
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;
}
}
现在我必须写更多的单词,因为我有太多的代码文本等等等等。
答案 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');