黑马程序员技术交流社区

标题: 关于do-while语句 [打印本页]

作者: 胡凤    时间: 2012-11-17 13:46
标题: 关于do-while语句
本帖最后由 胡凤 于 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结束:”为啥多出现了两次?
作者: 吴瑞祥    时间: 2012-11-17 14:19
大概是因为回车吧,C会有这个问题,你输入后必须加个GETCHAR把回车键给收走,不然会丢给下一个读取字符串的地方
作者: 胡凤    时间: 2012-11-17 14:21
这是用java写的呀
作者: 奚华    时间: 2012-11-17 14:29
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');//在这个地方过滤掉回车和换行符就可以了

        }

}

作者: 胡凤    时间: 2012-11-17 14:35
奚华 发表于 2012-11-17 14:29
package free;
import java.io.IOException;

这样按回车后就不能继续输入了-。-
作者: 奚华    时间: 2012-11-17 14:38
或者使用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
胡凤 发表于 2012-11-17 14:35
这样按回车后就不能继续输入了-。-

哦,对啊,我没意识到啊,sorry

作者: 黑马_张伟    时间: 2012-11-17 14:50
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');

        }

}
作者: 奚华    时间: 2012-11-17 14:54
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
黑马_张伟 发表于 2012-11-17 14:50
System.in.read().是从输入流中读取下一个数据字节。回车是\r\n。所以会有3次输出,如你输入的”a回车“, ...

好了-。- 谢谢解答
作者: 奚华    时间: 2012-11-17 14:58
我还想知道,为什么System.in.read()能够读取多个字符?是不是里面有缓存?

作者: 黑马_张伟    时间: 2012-11-17 15:36
奚华 发表于 2012-11-17 14:58
我还想知道,为什么System.in.read()能够读取多个字符?是不是里面有缓存?

其实不是能读取多个字符。而是read()方法从System.in这个输入流中读取一个字节,而且会自动往下读。也就是多次调用read()可以读出来多个。从api可以看到,“在输入数据可用、检测到流的末尾或者抛出异常前,此方法一直阻塞。”
作者: 快乐之恋    时间: 2012-12-3 17:36
{:soso_e163:
作者: 快乐之恋    时间: 2012-12-3 17:37
System.in.read().是从输入流中读取下一个数据字节。回车是\r\n。所以会有3次输出,如你输入的”a回车“, ...
作者: 马纵驰    时间: 2012-12-3 17:55
因为do while是先执行在判断,所以会多执行一次q




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2