2013-01-01 45 views
2

简单程序从DEITLE的书,读5个整数,程序应该打印含有该号码的相邻星号.i.e(如果num = 5的输出*****)线。 我已经在C++中测试过相同的解决方案,它工作正常。然而,这里的缓冲区保持着奇怪的值(50?)。 我认为问题在于使用缓冲区,但是我想知道为什么会发生这种情况?意外值

/* 
* To change this template, choose Tools | Templates 
* and open the template in the editor. 
*/ 
package javaapplication1; 
import java.io.*; 
import java.util.Date; 
/** 
* Program that reads five numbers and print starts equal to each number 
* 
* @author Hassan 
*/ 
public class JavaApplication1 

{ 


    public static void main(String[] args) 
    { 
     int num ; 
     java.io.InputStreamReader ins= new InputStreamReader(System.in); 
     java.io.BufferedReader bfr = new BufferedReader (ins); 

     try 
     { 


     for(int i=0;i<5;i++) 
     { 
      System.out.println("Please Enter a number"); 

      num = bfr.read(); 

     System.out.print(num); 


      for(int j=0;j<num;j++) 
       { System.out.print("* "); } 
        System.out.println("\n"); 


     }  
     } 

     catch(Exception E) 
     {System.out.println(E.getMessage()); } 



    } 
} 

编辑:问题已经解决,但5个输入的程序-is退房手续阅读3只,即它的读数输入和忽略下一个 enter image description here

+3

第一次读到的BufferedReader的InputStreamReader和类。你可以认为它打开了一个“输入管道”,你可以在其中插入一些数据(在你的int类型的例子中)。如果数据读取不正确,则会发生异常,我认为在您的示例中更正确的是IOException类。 E是Exception类的一个实例,getMessage()是这个类的一个方法。但是,在现代方法中,您使用Scanner类来从键盘输入不同类型的数据。 – user1929959

回答

6

你正在阅读一个字节,这将仅仅是第一个可用字符的ASCII值。 50是ascii中的'2'。您可能想要阅读并解析输入为文本的数字。

如果您使用readLine()而不是read()转换为String,则可以使用Integer.parseInt()来获得实际值。

+3

'readLine()'和'Integer.parseInt()':) –

+0

@PhilipWhitehouse是的,:) :) – JasonD

+0

@JasonD +1好抓! – alfasin

2

您的代码无法编译:使用//

  1. 写评论不\\
  2. 你的大括号没有对准其迷惑,并可能导致错误
  3. 当你写评论 - 请务必关闭括号在新行(否则是注释的一部分)

解决这三个问题,你的计划会奏效。

更新
JasonD是正确的,变化:

num = bfr.read(); 

到:

num = bfr.read()-48; 

,它会工作。原因在于你正在阅读一个字符,'0'是ascii中的48,'1'是49等,所以如果你期望在0-9范围内的输入,你应该减去48,它会起作用。

如果要处理数字> 9,则必须使用readLine()并解析输入String

+0

也许我只是在复制代码时误用了代码,因为它在Net beans中编译和工作。我现在编辑它 – HSN

+0

@HSN修复这三个问题使它在我的机器上编译和运行 – alfasin

+0

我又复制了它 – HSN