我正在使用替换密码技术,其中每个字母在字母行下被一个7个字母替换。如果输入单词之间出现空格,则在输出中也必须出现空格。
class Cipher
{
public static StringBuffer encrypt(String text, int s)
{
StringBuffer result= new StringBuffer();
for (int i=0; i<text.length(); i++)
{
if (Character.isUpperCase(text.charAt(i)))
{
char ch = (char)(((int)text.charAt(i)+s));
result.append(ch);
}
else
{
char ch = (char)(((int)text.charAt(i)+s));
result.append(ch);
}
}
return result;
}
public static void main(String[] args)
{
String text = "zhcl dhaly";
int s = -7;
System.out.println("Text : " + text);
System.out.println("Cipher: " + encrypt(text, s));
}
}
它将正确的输出显示为harini。但是,如果我输入“ Zhcldhaly”,则会显示“ sa \ e] aZer”。但是正确的输出是“节水”。
答案 0 :(得分:1)
尝试使用模数来包裹任何字符,这些字符在移位时会超出字母z
:
StringBuilder result = new StringBuilder();
int s = 7;
String text = "Zhcldhaly";
for (int i=0; i < text.length(); i++) {
char chr = text.charAt(i);
if (chr == ' ') {
result.append(" ");
}
else if (Character.isUpperCase(chr)) {
char ch = (char)('A' + (chr - 'A' - s + 26) % 26);
result.append(ch);
}
else {
char ch = (char)('a' + (chr - 'a' - s + 26) % 26);
result.append(ch);
}
}
System.out.println(result);
这将输出:
Savewater
答案 1 :(得分:0)
我假设您在抱怨sa\e]aZer
,或者确切地说:那里没有空间,这不是您的作业所能动摇的。
事情是:
if (Character.isUpperCase(text.charAt(i)))
仅检查字符是否为大写。它不会检查char是否为空格。
这非常简单:您需要一个if语句,其内容为:if space, then append space else "translate"
。
还请注意:当前代码中的if语句是没有意义的。当您仔细查看“ then”和“ else”的情况时,您会发现它们相同。
因此,长话短说:仔细查看所需的 if 语句,并相应地更改代码。仔细研究ASCII表以更好地了解您的输入字符期望什么样的输出,对您也可能非常有帮助。
除此之外:您应该了解解密和加密之间的区别!当您尝试取回原始文本时,您必须撤消操作!当减去7进行加密时,您需要添加 7进行解密。您不能使用 encrypt 方法解密加密的单词!