本帖最后由 alvis2015 于 2015-3-1 12:28 编辑
你while语句里面的判断条件是一个字符一个字符判断的,比如你输入了12asdf,程序先判断1,发现不是字母,提示你的输入有误
这个时候ch变量的下一个字符是2,又不是字母,有提示输入有误请重新输入,然后ch的下一个字符是a,发现是字母,就变成大写保存到数组中了
之后的sdf是一个道理,当f判断完成后,ch继续读入,发现是换行,然后就输出了数组中的大写字母。解决方法:如果碰到非法字符,则跳过输入流中剩余的字符,不再判断,而是等待用户输入,代码如下:
- import java.io.IOException;
- import java.io.InputStream;
- public class test {
- /**
- * @param args
- * @throws IOException
- */
- public static void main(String[] args) throws Exception {
- readKey_3();
- }
- /**
- * @throws IOException
- *
- */
- public static void readKey_3() throws IOException {
- final int ONEKB = 1024;
- char[] str = new char[ONEKB];//定义一个字符数组长度为1024的数组,长度溢出的错误请忽略,我认为已经够大了。
-
- System.out.println("请输入一串小写字母:");
- InputStream in = System.in;//输入流
- int ch = 0;//读取的字节
- int index = 0;//数组的指针
- int count = 0;
- while ((ch = in.read()) != -1) {
- if((ch>=97&ch<=122)||(ch==10||ch==13)){//健壮性判断
-
- if (ch == '\r')
- continue;
-
- if (ch == '\n') {//当读取到回车时,把数组中的字符转化为字符串存储。
-
- String temp = new String(str, 0, index);
-
-
- if ("over".equals(temp)) {
-
- System.out.println("程序已终止");
- break;
- }
- System.out.println("对应的字母大写为:" + temp.toUpperCase());//输出大写字符串。
- System.out.println("请输入一串小写字母或输入over结束程序。");
- index = 0;
- }
- else {
- str[index] = (char) ch;//把读取到的数据转化为字节存储到数组中。
- index++;
- }
- }
- else{
- System.out.println("输入不合法请重新输入:");
- in.skip(in.available()); //如果输入不合法,则跳过剩余可读字符,这样流中的指针就走到头了,因为下面没有字符了,所入进入阻塞状态等待用户输入
- }
- }
- }
- }
复制代码
|