2

DEITLE 书中的简单程序,读取 5 个整数,程序应打印包含该数量相邻星号的行。即(如果 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 个输入 - 仅读取 3 个,即其读取输入并忽略下一个 在此处输入图像描述

4

2 回答 2

6

您正在读取一个字节,它只是第一个可用字符的 ascii 值。50 在 ascii 中是“2”。您可能想要读取和解析作为文本输入的数字。

如果您使用readLine()而不是read(), 进入 a String,则可以使用Integer.parseInt()来获得真正的价值。

于 2013-01-01T00:57:29.720 回答
2

您的代码无法编译:

  1. //使用not写评论\\
  2. 您的大括号未对齐,这会造成混淆并导致错误
  3. 当你写评论时 - 确保在新行中关闭括号(否则它是评论的一部分)

解决这三个问题,您的程序就会运行。

更新
JasonD 是对的,改变:

num = bfr.read();

到:

num = bfr.read()-48;

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

如果要处理大于 9 的数字,则必须使用readLine()并解析 input String

于 2013-01-01T00:55:00.513 回答