string - java使用str.charAt(i)字符串下标越界?
天蓬老师
天蓬老师 2017-04-18 10:22:55
0
1
1076

我用java做的,一直提示String index out of range: 5
但是我也检测了这两个字符串的长度,是5,17,为什么在进入i的第一层循环的时候就会提示越界呢?这和next(),nextLine()的输入方式有关系吗?


PAT的一道练习题

旧键盘上坏了几个键,于是在敲一段文字的时候,对应的字符就不会出现。现在给出应该输入的一段文字、以及坏掉的那些键,打出的结果文字会是怎样?

输入格式:

输入在2行中分别给出坏掉的那些键、以及应该输入的文字。其中对应英文字母的坏键以大写给出;每段文字是不超过105个字符的串。可用的字符包括字母[a-z, A-Z]、数字0-9、以及下划线“_”(代表空格)、“,”、“.”、“-”、“+”(代表上档键)。题目保证第2行输入的文字串非空。

注意:如果上档键坏掉了,那么大写的英文字母无法被打出。

输出格式:

在一行中输出能够被打出的结果文字。如果没有一个字符能被打出,则输出空行。

输入样例:
7+IE.
7_This_is_a_test.
输出样例:
_hs_s_a_tst

下面是我的代码:

import java.util.Scanner;

public class pat_1033 {

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String x = in.nextLine();
        String y = in.nextLine();
        boolean flag = true;
        for (int j = 0; j < x.length(); j++) {
            if (x.charAt(j) == ',' || x.charAt(j) == '.' 
                    || x.charAt(j) == '+' || x.charAt(j) == '-') {
                flag = false;
            }
        }
        //测试输入的字符串长度
    //    System.out.println(x.length()+"    "+y.length());
        //用來記不相同个数的,sum是没有坏掉的个数
        int count ,sum = 0;
        for (int i = 0; i < x.length(); i++) {
            //判断i执行了几次
            //System.out.println(i);
            count = 0;
            for(int j = 0;j < y.length();j++){
                //没有大写
                if(flag){
                    if(y.charAt(i)!=x.charAt(j)){        
                        count++;
                    }
                }
                //有大写
                else{
                    if(y.charAt(i)!=x.charAt(j)&&(!(y.charAt(j)>='A'&&y.charAt(j)<='Z'))){
                        count++;
                    }
                }
                //输出没有坏掉的数字
                if(count==y.length()){
                    System.out.print(y.charAt(j));
                }
            }
        }
        if(sum==0){
            System.out.println();
        }
    }

}


大致思路是先判断有没有上档键坏掉的,如果有,则大写字符都不输出。flag是标志上档键的。
然后用count来标记能输出的字符,如果等于第二行字符串长度则证明这个键没有坏掉可以输出。
sum是如果全都坏掉,输出一个空行。
天蓬老师
天蓬老师

欢迎选择我的课程,让我们一起见证您的进步~~

reply all(1)
左手右手慢动作

I haven’t looked at the specific code, but I saw that you used a few subscripts incorrectly, so I’ll change them to this:

//没有大写
if(flag){
    if(y.charAt(j)!=x.charAt(i)){
        count++;
    }
}
//有大写
else{
    if(y.charAt(j)!=x.charAt(i)&&(!(y.charAt(j)>='A'&&y.charAt(j)<='Z'))){
        count++;
    }
}

i 对应于 x 的下标, j 对应于 y 的下标, 你代码里面直接混用了, 导致内层循环, j == 5, 执行 x.charAt(j) time, crossed the line.

Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template