当用户键入数字以跳过字母时,在跳过字母(字母z)时没有输出

时间:2016-04-12 15:51:12

标签: java

我有这个程序,它会根据用户输入的指定值输出一个字母或单词。例如,当用户键入字母a时,用户将再次键入数字(例如2),输出将为c。在我的程序中,当用户键入单个字母并且字母为z时,它正在工作。但是,当使用类型超过字母z的数字时,将没有输出。例如,xyz中的用户类型和要跳过的类型4,没有输出。

public class FinalsActivity2 {
    Scanner fc = new Scanner(System.in);
    char characters[] = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'};
    File file = new File("C:\\Users\\TeonGo\\Desktop\\final2.txt");
    PrintWriter pw = new PrintWriter(file);

    public FinalsActivity2() throws IOException {
        System.out.print("Enter text:");
        String text = fc.nextLine();
        System.out.print("Enter number:");
        int num = Integer.parseInt(fc.nextLine());

        try {
            for (int f = 0; ; f++) {
                for (int c = 0; c < 26; c++) {
                    if (text.charAt(f) == characters[c]) {
                        pw.print(characters[num + c]);
                    }
                }
            }
        } catch (Exception e) {
        }
        pw.close();
    }

    public static void main(String[] args) throws IOException {
        new FinalsActivity2();
    }
}

2 个答案:

答案 0 :(得分:1)

我查看了您的代码并尝试纠正它 (我知道我可能不应该像你需要学习这些东西但是为了回答这个问题而这样做),而不是上面Jon Skeet关于你的问题的评论中给出的规范:

  

要修复的第一件事:删除异常吞咽,而是修复你的for循环,只是循环遍历字符串中的每个字母。接下来,我只是将输出打印到屏幕而不是文件,我还将所有代码放入主方法,而不是无缘无故地拥有一堆字段并将代码放入构造函数。所有这些都将使您更容易阅读代码并查看错误。我还建议让你的IDE格式化代码,并适当地缩进代码。完成所有这些更改后,使用更简单的代码编辑您的问题。

如下所示是您所述规范的代码实现:

import java.util.Scanner;

public class Test {

private Scanner sc = new Scanner(System.in); 
private char characters[]= {'a','b','c','d','e','f','g','h','i','j','k','l','m',
            'n','o','p','q','r','s','t','u','v','w','x','y','z'};

    public static void main(String[] args){
      Test test = new Test();
      test.FinalsActivity2();
    }

    public void FinalsActivity2(){
       System.out.print("Enter text: ");
       String text = sc.nextLine();
       System.out.print("Enter number: ");
       int num = Integer.parseInt(sc.nextLine());
       for(int f = 0; f < text.length(); f++){
           for(int c = 0; c < 26; c++){
               if (text.charAt(f) == characters[c]){
                   System.out.print(characters[num + c]);
                }
            }
        }
     sc.close();
    }

}

这个代码似乎适用于您的示例。 当用户给出四(4)作为改变字母表的数量时,代码确实导致hello被转换为lipps。然而,这是正确的输出,因为代码h + 4 = l,e + 4 = i,l + 4 = p和o + 4 = s。

我从控制台获得的输出&#34;你好&#34;第一个输入是:

Enter text: hello
Enter number: 4
lipps

只需&#34; o&#34;:

Enter text: o
Enter number: 4
s

您的问题的答案似乎是您错过了计算输出应该是什么。

答案 1 :(得分:1)

您没有看到任何输出,因为当您尝试访问ArrayIndexOutOfBoundsException characters数组时,您获得了z,因为您正在吞食您无法看到的异常它

如果您想要在到达characters时回到z数组,请使用模数结果来获取索引。像这样的东西。

    for (int f = 0; f < text.length(); f++) {
        for (int c = 0; c < characters.length; c++) {
            if (text.charAt(f) == characters[c]) {
                int idxToGet = (num + c) % characters.length;
                pw.print(characters[idxToGet]);
            }
        }
    }

如果您想忽略经过z的任何事情,请使用以下

    for (int f = 0; f < text.length(); f++) {
        for (int c = 0; c < characters.length; c++) {
            int idxToGet = num + c;
            if (text.charAt(f) == characters[c] && idxToGet < characters.length) {
                pw.print(characters[idxToGet]);
            }
        }
    }