这个密码程序在哪里出错了?

时间:2013-11-01 21:32:28

标签: java

我需要编写一个程序,该程序接受一个人的名字,中间名和姓,并对其进行加密:用户输入的每个字母都由所选键循环移位。例如,如果密钥为1且原始字母为“A”,则加密的字母将为“B”。如果密钥为3且原始字母为“b”,则加密的字母将为“e”。如果密钥为3且原始字母为“z”,则加密后的字母将为“c”。

这是我的代码:

import java.util.Scanner;
public class  Cipher {
    public static void main(String []main){
        Scanner console = new Scanner(System.in);
        System.out.print("Enter your first name: ");
        String firstname = console.nextLine();
        System.out.print("Enter your middle name: ");
        String middlename = console.nextLine();
        System.out.print("Enter your last name: ");
        String lastname = console.nextLine();
        System.out.print("enter the key ");
        int N = console.nextInt();
        String s = firstname + middlename + lastname;
        System.out.print("your original name is "+ s);
        String empty = "";
        for( int i = 0; i<=s.length();i++){
            if (s.charAt(i)!=' '){
                System.out.print(empty ="" + s.charAt(i));
            }
            else{
                System.out.print(empty +=s.charAt(i+N));
            }

              }
            System.out.print("encrypted name is " + empty);
    }
}

我的问题似乎在循环中,但我不知道如何修复它。

我得到的是什么:

Enter your first name: a
Enter your middle name: b
Enter your last name: c
enter the key 2
your original name is abcaababcException in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 3
    at java.lang.String.charAt(String.java:686)
    at test1.test.main(test.java:19)

虽然我应该得到的例子如下:

Enter your first name: a
Enter your middle name: b
Enter your last name: c
enter the key 2
your original name is abc
encrypted name is cde

2 个答案:

答案 0 :(得分:0)

你不能用这个:

s.charAt(i+N)

由于它会访问字符串后面的字符 - 您可以使用0s.length()的索引

答案 1 :(得分:0)

请考虑使用此代码而不是上一个for-loop

    byte[] input = s.getBytes();
    for (int i = 0; i < input.length; ++i) {
        input[i]+= N;
    }

    String encrypted = new String(input);
    System.out.print("encrypted name is " + encrypted);

在ASCII符号集上应该没问题。