A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 胡凤 中级黑马   /  2012-11-17 13:46  /  2802 人查看  /  14 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 胡凤 于 2012-11-17 14:58 编辑

package free;

import java.io.IOException;

public class TestDow {
/*
* 不断地读取从键盘上输入的字符,直到读到字符’q’时,程序结束。
*/
        
        public static void main(String[] args) {
                char a='0';
                do{
                        System.out.println("请输入字符,以q结束:");
                        try {
                                a=(char)System.in.read();
                                System.out.println(a);
                        } catch (IOException e) {
                                
                                e.printStackTrace();
                        }
                }while(a!='q');

        }

}
结果如下:
请输入字符,以q结束:
a
a
请输入字符,以q结束:


请输入字符,以q结束:


请输入字符,以q结束:
想知道“请输入字符,以q结束:”为啥多出现了两次?

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 赞一个!

查看全部评分

14 个回复

倒序浏览
大概是因为回车吧,C会有这个问题,你输入后必须加个GETCHAR把回车键给收走,不然会丢给下一个读取字符串的地方
回复 使用道具 举报
这是用java写的呀
回复 使用道具 举报
package free;
import java.io.IOException;

public class TestDow{
/*
* 不断地读取从键盘上输入的字符,直到读到字符’q’时,程序结束。
*/
        
        public static void main(String[] args) {
                char a='0';
                do{
                        System.out.println("请输入字符,以q结束:");
                        try {
                                a=(char)System.in.read();
                        } catch (IOException e) {
                                
                                e.printStackTrace();
                        }
                }while(a!='q'&&a!='\n'&&a!='\r');//在这个地方过滤掉回车和换行符就可以了

        }

}

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 可以给说下为什么会出现两次的原因.

查看全部评分

回复 使用道具 举报
奚华 发表于 2012-11-17 14:29
package free;
import java.io.IOException;

这样按回车后就不能继续输入了-。-
回复 使用道具 举报
或者使用Scanner的nextLine

import java.util.Scanner;


public class TestDow2 {

        /**
         * @param args
         */
        public static void main(String[] args) {
                // TODO Auto-generated method stub
                //使用Scanner类的nextLine()方法
                Scanner scn =new Scanner(System.in);
                System.out.println("请输入字符,以q结束:");
               
                String str=null;
                while (scn.hasNextLine()&&!(str=scn.nextLine()).equals("q"))
                {
                        System.out.println(str);
                }

        }

}
回复 使用道具 举报
奚华 中级黑马 2012-11-17 14:40:57
7#
胡凤 发表于 2012-11-17 14:35
这样按回车后就不能继续输入了-。-

哦,对啊,我没意识到啊,sorry
回复 使用道具 举报
System.in.read().是从输入流中读取下一个数据字节。回车是\r\n。所以会有3次输出,如你输入的”a回车“,即第一次读的是‘a’,判断一次条件不满足结束。再读下一个是\r,输出的是\r,判断条件还是不满足结束,再读取\n。然后又会回到 a=(char)System.in.read();这一句等待输入。所以会多出现两次。

4楼的代码也是不对的。楼主是要循环读取,你这样做就只能读一次了。用以下代码可以:

import java.io.IOException;

public class TestDow {
/*
* 不断地读取从键盘上输入的字符,直到读到字符’q’时,程序结束。
*/
        
        public static void main(String[] args) {
                char a='0';
                do{
                        if(a!='\r'&&a!='\n'){
                                System.out.println("请输入字符,以q结束:");
                        }
                        try {
                                a=(char)System.in.read();
                                if(a!='\r'&&a!='\n'){
                                        System.out.println(a);
                                }else{
                                        continue;
                                }
                        } catch (IOException e) {
                                e.printStackTrace();
                        }
                }while(a!='q');

        }

}

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 赞一个!

查看全部评分

回复 使用道具 举报
奚华 中级黑马 2012-11-17 14:54:35
9#
import java.io.IOException;

public class TestDow3 {
/*
* 不断地读取从键盘上输入的字符,直到读到字符’q’时,程序结束。
*/
        
        public static void main(String[] args) {
                char a='0';
                System.out.println("请输入字符,以q结束:");
                do{
                        try {
                                a=(char)System.in.read();
                                if (a=='\n'||a=='\r')
                                        continue;
                                System.out.println(a);
                                if(a!='q')
                                        System.out.println("请输入字符,以q结束:");
                        } catch (IOException e) {
                                
                                e.printStackTrace();
                        }
                }while(a!='q');

        }

}
回复 使用道具 举报
胡凤 中级黑马 2012-11-17 14:54:49
10#
黑马_张伟 发表于 2012-11-17 14:50
System.in.read().是从输入流中读取下一个数据字节。回车是\r\n。所以会有3次输出,如你输入的”a回车“, ...

好了-。- 谢谢解答
回复 使用道具 举报
奚华 中级黑马 2012-11-17 14:58:42
11#
我还想知道,为什么System.in.read()能够读取多个字符?是不是里面有缓存?
回复 使用道具 举报
奚华 发表于 2012-11-17 14:58
我还想知道,为什么System.in.read()能够读取多个字符?是不是里面有缓存?

其实不是能读取多个字符。而是read()方法从System.in这个输入流中读取一个字节,而且会自动往下读。也就是多次调用read()可以读出来多个。从api可以看到,“在输入数据可用、检测到流的末尾或者抛出异常前,此方法一直阻塞。”
回复 使用道具 举报
{:soso_e163:
回复 使用道具 举报
System.in.read().是从输入流中读取下一个数据字节。回车是\r\n。所以会有3次输出,如你输入的”a回车“, ...
回复 使用道具 举报
因为do while是先执行在判断,所以会多执行一次q
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马