返回字符串的方法

时间:2012-01-08 23:42:00

标签: java encryption

所以我正在用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')。有什么建议吗?

6 个答案:

答案 0 :(得分:2)

只需将每个转换后的角色附加到StringBuilderStringBuffer即可。

答案 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的新字符串,为其添加了字符,并将其返回。

修改

但是,您似乎可能想要修改实际的StringstrTarget

为此,您不应将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]);
}

在此示例中,ifoo中进行了修改,因为它是通过引用传递的。

在原始方法中,将返回类型设为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;