2013-01-01 52 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