java - 凯撒密码程序,如何只使用字符a-z?

标签 java string caesar-cipher

Caesar Cipher 单独应用于字符串中的每个字母。每个字母必须在字母表中向前移动 n 步。如果一个字母从字母表的末尾移出(‘z’),那么它会一直移回到字母表的开头(‘a’)。 `

import java.util.*;

class question7{

    public static void main (String[] args ){

        String str = "";
        //allowing program to take user input using the keyboard
        Scanner kb = new Scanner(System.in);
        Scanner s = new Scanner(System.in);

        int n = 0;
        System.out.println("increasing the letters in string by n");

        while (true){
            System.out.println("Please enter your string");
            str = kb.nextLine(); 

            System.out.println("Please enter your n value");
            n = s.nextInt(); 

            String incrementedword=new String();
            for (int i=0;i<str.length();i++){
                incrementedword+=(char)(str.charAt(i)+n);
            }

            System.out.println ("your word is "+incrementedword);

        }
    }
}

例如,下面的输入(“hello world”,1)应该返回“ifmmp xpsme”

然而,当我输入(“hello world”,1)时,输出是“ifmmp!xpsme”

我做错了什么?

最佳答案

这里有两个问题:

  • 在将一些字符递增到接近字母表末尾后,您将获得非字母数字字符(例如,z+1 将变为花括号 { - 请参阅 ASCII table)。尝试使用余数运算符 (%)。例如,117 % 100 将是 17,13 % 3 将是 1。这样 (x + 1) % 10 永远不会超过 10,将从 0 开始计数并随着 x 的增加再次向上计数。
  • 如果您只想加密 a..z 和 A..Z 范围内的字符,请排除其他字符。简单比较有效:if (x>='a' && x <='z') 。

我不会在这里提供完整的工作代码,因为看起来像是作业。

关于java - 凯撒密码程序,如何只使用字符a-z?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48646646/

相关文章:

javascript - 如何在不重复分隔字符串的情况下使用javascript正则表达式删除部分字符串

java - String.chars() 和 String.codePoints() 上的 javadoc 不正确吗?

java - 使用正则表达式将字符串拆分为 3 部分

密码程序 — 错误 : unused variable

python - 凯撒移位密码

java - Arraylist - 字符串/ double

Java 嵌入式数据库 h2

java - 缺少单独的调试信息,请使用 : debuginfo-install glibc-2. 12-1.166.el6_7.7.x86_64

java - Glassfish/JMS : Does each Destinatation Resource require its own Connection Factory?

c++ - 我如何在 C++ 的 Caesar Cipher 程序中包含空格?