2011-10-24 1 views
17

나는 많은 학생을 입력하라는 간단한 프로그램을 작성한 다음 사용자에게 각 학생의 이름과 점수를 입력하여 어떤 학생이 가장 높은 점수를 얻었는지 확인하도록 요청합니다.Java 문자열 스캐너 입력이 정보를 기다리지 않고 직접 다음 문으로 이동합니다. 정보를 기다리는 방법?

나는 프로그램 코드를 작성하고 컴파일한다. 첫 번째 줄은 여러 명의 학생을 묻고 입력을 기다립니다. 두 번째 줄은 학생 이름을 묻고 입력을 기다리는 것으로 가정하고, 세 번째 줄은 그 학생의 점수를 묻고 입력을 기다려야하지만 두 번째 줄이 인쇄 된 후 세 번째 줄이 즉시 호출됩니다 (두 번째 줄은 않습니다 입력을 기다리지 말 것) 그리고 세 번째 줄 뒤에 요청 된 정보를 입력하려고 할 때 런타임 오류가 발생합니다.

두 번째 줄이 인쇄되고 세 번째 줄을 인쇄하기 전에 문자열을 입력하기를 기다리는 코드를 어떻게 조정합니까? 나는 때문에이 동작하는 Scanner를 사용 좋아하지 않았어요하지 할

import java.util.Scanner; 

public class HighestScore { 
    public static void main(String[] args) { 
     Scanner input = new Scanner(System.in); 

     System.out.print("Enter the number of students: "); 
     int numOfStudents = input.nextInt(); 

     System.out.print("Enter a student's name: "); 
     String student1 = input.nextLine(); 

     System.out.print("Enter that student's score: "); 
     int score1 = input.nextInt(); 

     for (int i = 0; i <= numOfStudents - 1; i++) { 

      System.out.println("Enter a student's name: "); 
      String student = input.nextLine(); 

      System.out.println("Enter that student's score: "); 
      int score = input.nextInt(); 

      if (score > score1) { 
      student1 = student; 
      score1 = score; 
      } 
     } 
     System.out.println("Top student " + 
     student1 + "'s score is " + score1); 
    } 
} 

답변

14
System.out.print("Enter the number of students: "); 
    int numOfStudents = input.nextInt(); 
    // Eat the new line 
    input.nextLine(); 
    System.out.print("Enter a student's name: "); 
    String student1 = input.nextLine(); 
+0

브릴리언트! 그것은 작동합니다! 고맙습니다! – user1011064

36

는 그입니다. (일단 내가 무슨 일이 벌어지고 있었는지 이해하고 그것에 익숙해지면 나는 스캐너를 많이 좋아한다.)

nextLine()을 호출하면 사용자가 학생 번호를 입력 한 행이 먼저 완료됩니다. 왜? nextInt()은 int를 하나만 읽고 행을 완료하지 않기 때문에.

readLine() 문을 추가하면이 문제가 해결됩니다.

System.out.print("Enter the number of students: "); 
int numOfStudents = input.nextInt(); 

// Skip the newline 
input.nextLine(); 

System.out.print("Enter a student's name: "); 
String student1 = input.nextLine(); 
이미 언급 한 바와 같이

, 나는 스캐너를 사용하여 좋아하지 않았다. 내가 해왔 던 것은 BufferedReader를 사용하는 것이었다. 더 많은 일이지만, 실제로 일어나고있는 일이 조금 더 간단합니다. 응용 프로그램이 다음과 같을 것이다 :

그 나쁜 디자인처럼 보이는 와우
BufferedReader input = new BufferedReader(new InputStreamReader(System.in)); 

System.out.println("Enter the number of students: "); 
int numOfStudents = Integer.parseInt(input.readLine()); 

String topStudent = null; 
int topScore = 0; 
for (int i = 0; i < numOfStudents; ++i) 
{ 
    System.out.print("Enter the name of student " + (i + 1) + ": "); 
    String student = input.nextLine(); 

    // Check if this student did better than the previous top student 
    if (score > topScore) 
    { 
     topScore = score; 
     topStudent = student; 
    } 
} 
1

- 당신은 정수에 대한 개발을 요청하는 경우 nextInteger()이 스캐너가 당신에게 정수를 줄 것이다, 그러나 지금 새로운 라인을 보유 문자를 버퍼에 저장해야합니다. 사용자가 정수를 입력하려면 Enter 키를 눌러야하므로 나중에 사용자에게 문자열을 입력하라는 메시지가 표시되면 입력을 기다리지 않고 새 줄 문자를 반환합니다. 이런 종류의 문제를 피하기 위해 스캐너를 지울 수 없습니다 ...

내가 무엇이 누락 되었습니까?

아담

관련 문제