Home>Q&A>body text

string - java使用str.charAt(i)字符串下标越界?

我用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是如果全都坏掉,输出一个空行。
天蓬老师天蓬老师 2709 days ago 1039

reply all(1)I'll reply

  • ringa_lee

    ringa_lee2017-04-18 10:24:55

    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.

    reply
    0
  • Cancelreply