所以我正在用Java做一个简单的加密程序。用户输入一个字符串(strTarget),然后该字符串被带到此函数。在for循环中,它应该取字符的ASCII值,将其减少4,然后将其返回到字符串(对字符串中的所有字符执行此操作)。当你看到我的朋友时,我已经这样做了,但是,我不确定如何重建我希望得到的字符串(例如,如果用户输入'efg',返回的字符串应该是'abc')< / p>
所以,这是我得到的建议的结果。我在Menu类中显然做错了,不确定它是什么。当我输入要加密的字符串时,它会停止工作。
import java.util.Scanner;
public class Menu {
public static String strTarget;
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
System.out
.println("Welcome to the encr/decr program");
System.out
.println("To encrypt a string, press 1, to decrypt a string, press 2");
int choice = in.nextInt();
if (choice == 1) {
System.out.println("Type the string you want to encrypt.");
strTarget = in.next();
System.out.println(Encrypt(strTarget));
}
if (choice == 2) {
System.out.println("Enter the string you want to decrypt.");
}
}
private static String Encrypt(String strTarget) {
// TODO Auto-generated method stub
int len = strTarget.length()-1;
String destination = "";
for (int i = 0; i<len; i++)
{
if (strTarget.charAt(i) != ' ')
{
char a = strTarget.charAt(i);
int b = (int) a;
b = strTarget.charAt(i)-4;
a = (char) b;
if ( b<70 && b>64)
{
b = strTarget.charAt(i)+26;
a = (char) b;
destination += a;
}
}
}
return destination;
} }
编辑:添加了完整的程序。
import java.util.Scanner;
public class Menu {
public static String strTarget;
public static String destination = "";
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
System.out.println("Welcome to the encr/decr program");
System.out.println("To encrypt a string, press 1, to decrypt a string, press 2");
int choice = in.nextInt();
if (choice == 1) {
System.out.println("Type the string you want to encrypt.");
strTarget = in.next();
StringBuilder zomg = new StringBuilder(strTarget);
System.out.println(Encrypt(zomg));
}
if (choice == 2) {
System.out.println("Enter the string you want to decrypt.");
}
}
private static String Encrypt(StringBuilder zomg) {
// TODO Auto-generated method stub
int len = strTarget.length()-1;
for (int i = 0; i<len; i++)
{
if (strTarget.charAt(i) != ' ')
{
char a = strTarget.charAt(i);
int b = (int) a;
b = strTarget.charAt(i)-4;
a = (char) b;
destination += a;
if ( b<70 && b>65)
{
b = strTarget.charAt(i)+26;
a = (char) b;
destination += a;
}
}
}
System.out.println(destination);
return destination;
}}
我做了你所说的改变(我认为),它开始起作用了,但它没有按预期工作。给出一些似乎没有意义的结果(对于'A',它返回=,对于'V',它返回'V')。有什么建议吗?
答案 0 :(得分:2)
只需将每个转换后的角色附加到StringBuilder
或StringBuffer
即可。
答案 1 :(得分:2)
这是一个递归解决方案:
您想使用Encrypt(string,0)
private static String Encrypt(String strTarget, int place) {
// TODO Auto-generated method stub
if (place==strTarget.length()) {
return strTarget;
}
if (strTarget.charAt(place) != ' ')
{
char a = strTarget.charAt(place);
int b = (int) a;
b = strTarget.charAt(place)-4;
a = (char) b;
if ( b<70 && b>64)
{
b = strTarget.charAt(place)+26;
a = (char) b;
}
return Encrypt(strTarget.substring(0,place)+a+strTarget.substring(place+1,strTarget.length()),place+1);
}
return null;
}
答案 2 :(得分:0)
private static String Encrypt(String strTarget) {
// TODO Auto-generated method stub
int len = strTarget.length()-1;
String destination = "";
for (int i = 0; i<len; i++)
{
if (strTarget.charAt(i) != ' ')
{
char a = strTarget.charAt(i);
int b = (int) a;
b = strTarget.charAt(i)-4;
a = (char) b;
if ( b<70 && b>64)
{
b = strTarget.charAt(i)+26;
a = (char) b;
destination += a;
}
}
return destination;
}
我添加了一个名为destination
的新字符串,为其添加了字符,并将其返回。
修改强>
但是,您似乎可能想要修改实际的String
,strTarget
。
为此,您不应将strTarget作为参数传递,因为passes it by value rather than by reference.
要实际修改字符串,请按照here概述传递StringBuilder
。 (顺便说一句,“这里”是一个链接。)
编辑#2
说你有方法。称之为foo
。 Foo将int
作为参数并将其设置为1:
public static void foo(int i) {
i = 1;
}
现在您要测试您的方法:
public static void main(String[] args) {
int i = 0;
foo(i);
System.out.println(i);
}
这应该打印1,对吗?
否即可。它没有。它打印"0"
。如果需要,您可以测试它。
这是因为整数是“按值传递”。当按值传递某些内容时,虚拟机基本上会复制它并将副本传递给方法。
因此,当您在i=1
方法中执行foo
时,实际上是将i
复制为1
,而不是i
。所以i
保持不变。
还有另一种类型的参数传递,称为按引用传递。当通过引用传递某些内容时,该方法会修改实际变量。
例如,数组通过引用传递。拿这个代码,例如:
public static void foo(int[] i) {
i[0] = 1; // i must have at least one element.
}
public static void main(String[] args) {
int[] i = new int[1];
foo(i);
System.out.println(i[0]);
}
在此示例中,i
在foo
中进行了修改,因为它是通过引用传递的。
在原始方法中,将返回类型设为void
。如果返回类型为void,则无法返回加密的String
。所以我想到你可能希望通过引用传递并修改strTarget
本身。
要执行此操作,您将传递StringBuilder
,而不是传递strTarget
。您可以使用new StringBuilder(strTarget)
创建它,它会自动pass by reference
。如果你想要这个,那么我要做的是生成destination
String
(如上所述),然后修改StringBuilder
以将strTarget
更改为{ {1}} destination
。
我希望这会有所帮助。
答案 3 :(得分:0)
您可能想尝试以下内容:
private static String encrypt(String strTarget) {
char[] chars = strTarget.toCharArray();
for(int i=0; i<chars.length; i++) {
if(chars[i] != ' ') {
int asciiVal = chars[i];
asciiVal -= 4;
if(asciiVal < 70 && asciiVal > 64) {
asciiVal += 26;
}
chars[i] = (char) asciiVal;
}
}
return String.valueOf(chars);
}
答案 4 :(得分:0)
使用某些角色魔法的可读,更面向对象的版本:
private static final int MOD_ALPHABET = 'Z' - 'A' + 1;
private static String rot(int rot, String toEncrypt) {
int rangedRot = rot % MOD_ALPHABET;
if (rangedRot < 0) {
rangedRot = MOD_ALPHABET + rangedRot;
}
final StringBuilder sb = new StringBuilder(toEncrypt);
for (int i = 0; i < sb.length(); i++) {
final char plainChar = sb.charAt(i);
final char startChar;
if (plainChar >= 'A' && plainChar <= 'Z') {
startChar = 'A';
} else if (plainChar >= 'a' && plainChar <= 'z') {
startChar = 'a';
} else {
continue;
}
char cryptChar = (char) (plainChar - startChar);
cryptChar += rangedRot;
cryptChar %= MOD_ALPHABET;
cryptChar += startChar;
sb.setCharAt(i, cryptChar);
}
return sb.toString();
}
答案 5 :(得分:-1)
在for循环之前初始化一个空字符串:
String target = "";
在内心如果这样做:
target += a;
那应该这样做!
return target;